Вопрос: Какую защиту использовать от спам ботов?

Лучший ответ: Повторяю способы защиты, выбирайте любой, который нравится:

Начнем со случая, когад у вас маленький (меньше 100 тыс юников в день/1 млн зарегистрированных юзеров) сайт.

1) Сделать невидимое поле с именем email. 98% ботов-дебилов его заполнят, дальше вы понимаете, что с ними делать и куда вносить их IP. Чтобы не палиться, не пишите style=display:none, а скройте его чуть хитрее.

Этот способ у меня отсеивает практически всех ботов на одном сайте. Правда, там боты, не заточенные под сайт, а просто, которые ходят и заполняют все формы подряд своей рекламой. Типа Хрумера наверно.

2) Заполняемое яваскриптом поле типа hidden. Куча ботов не выполняют яваскрипт. Куки, кстати, наоборот, большинство ботов исправно присылают. Реферер и юзер-агент тоже обычно у них правильный.

3) Более радикальный подход — убрать кнопку submit, заменив ее на div, который по событию onclick собирает значения полей формы и отправляет их аяксом. Аттрибут action тега form сделать указывающим на скрипт-ловушку. Если бот не написан специально под ваш сайт, он тупо не сможет отправить такую форму.

Ок, допустим, вам не повезло, и ваш сайт с миллионами пользователей атакуют спамеры специально написанными скриптами. Что мы можем вам предложить?

4) Добавлять вычисляемые/расшифровываемые яваскриптом поля. Внезапная смена алгоритма шифрования в 2 часа ночи скорее всего сдаст тех ботов, которые смогли через нее пробиться, но не успели переписать алгоритм.

5) Проверять поддержку клиентом Flash (загружать флешку и через нее подписывать форму кодом).

6) Проверять соответствие User-Agent и уровня поддержки технологий HTML5/CSS3 (например, определенные версии браузеров не поддерживают border-radius, другие поддерживают, и тд.)

Более серьезные возможности дают методы статистического анализа. Например, можно вычленять из сообщений несловарные слова (это будут ссылки например) и анализировать источники их отправки. Например, если 1000 пользователей начинает за час отправлять по 100 сообщений не-друзьям с одним и тем же словом super-shop — это явный признак спам-рассылки. Для таких систем надо собирать статистику и писать белые/черные правила, вводить негласные лимиты подозрительных действий, в общем. серьезная работа.

Можно, как вконтакте, привязывать аккаунты к телефонам. это работает.

Еще немного рассуждений на эту тему тут: habrahabr.ru/qa/16920/#answer_70019

А использование капчи в формах говорит о лени/низкой квалификации/урезанном бюджете или непрофессионализме и причиняет неудобства пользователям.

Худший ответ: На самом деле тема очень интересная.

На это стоит ещё посмотреть с такой стороны: есть ли у вас пользователи с Opera Mini и другими подобными браузерами? Так вот, изображения часто у них отключены, поэтому капчу они не увидят. Но это не беда — картинку можно и загрузить.

Главное, чтобы даже если капча есть, её можно было использовать. Поэтому к экзотическим вариантам типа «собери картинку»/«кликни по картинке с кубиком» я бы отнёсся настороженно.

Если ваша главная задача — отсеять ботов, посмотрите, что для них характерно и что не характерно для пользователей. Во-первых, люди не комментируют сразу после загрузки страницы. Во-вторых, если у вас на сайте нигде не используется BB-код, а в сообщениях он есть — это скорее всего сообщения от ботов. Куча ссылок в сообщении? Опять же, вероятнее всего это спам бот. Для «подозрительных» пользователей можно выдавать капчу или принимать их комментарии, но оставлять на премодерацию. Вариантов масса.

Кстати, ещё один хинт: боты не читают (впрочем, некоторые люди тоже). Поэтому капчи типа «поставьте галочку если вы не бот» / «не заполняйте это поле если вы не бот» тоже могут работать.