Концепция человечной защиты от ботов.
Мое активное присутствие в интернете можно отсчитывать с 6 апреля 2005, когда я впервые установил phpBB 2.0.13 на свой компьютер с целью “поиграться”. И с тех пор этот движок занимает достаточно важную часть моей жизни. Соответственно, занимаясь форумами, мне приходилось сталкиваться с разными видами спама и защиты от него. Среди последних были и эффективные, и не очень. Ниже я постараюсь изложить метод защиты от спама, который должен сбивать с толку ботов и без проблем проходиться человеком.
Базовая идея.
Боты пользуются большим распространением небольшого количества известных движков. Научился работать с одним из них - получил возможность спамить по десяткам тысяч ресурсов. С другой стороны, каким бы навороченным не был пятый хрумер - даже двадцать пятый не сможет оценивать смысловую составляющую формы регистрации/постинга, как это делает человек.
Соответственно, наша задача - сделать форму непонятной для бота.
Техническая сторона.
Бот имеет возможность вычленять по определенным сигнатурам те или иные части страницы и анализировать их, определяя назначения полей или типы защиты. Чаще всего он ориентируется на имена полей, реже - на их порядок, совсем редко - на располагающиеся рядом подписи.
Таким образом, чтобы отсеять абсолютное большинство ботов, мы должны разрушить хотя бы два первых ориентира.
Для первого вариант прост: имена полей формы должны быть уникальны для каждого экземпляра движка. Это можно достигнуть путем привязки к домену, а так же использование некоторого случайного числа, которое будет генерироваться при установке. Затем можно проделывать какое угодно количество хеширований (формулу хеширования тоже, кстати, можно сделать динамической) и пропускать имена всех полей через оные процедуры.
Со вторым вариантом, чтобы не осложнять жизнь людям, чуть сложнее, но лишь чуть. Выходом будет случайное разбрасывание по всей форме дополнительных полей-призраков со своими уникальными именами, скрытых при помощи JS или CSS от глаз людей. Чем больше такого мусора - тем больше шанс запутать бота. Заполнение хотя бы одного из таких полей будет сигналом для срабатывания защиты.
Как вариант, этим полям можно по умолчанию давать какие-то значения и сверять их при обработке формы.
На последний пункт сложнее всего влиять, поскольку подписи к формам необходимы в первую очередь людям, но и тут есть выход. К полям-призракам можно добавлять подписи, дублирующие подписи нормальных полей. Тогда боту придется угадывать правильное поле и чем больше полей-призраков, тем меньше у него шансов.
Больше крови!
Чтобы окончательно посадить спамеров на бобы, можно генерировать уникальные имена полей и расположение полей-призраков для каждой сессии.
Человеческая сторона.
Замечательность такого подхода, на мой взгляд, состоит в том, что человек даже не заметит присутствия антиспама, если его, конечно, не понесет читать исходный код страницы.
Реализация.
Подход, связанный с переименованием полей используется в моде для phpBB2 Stop Advertisement Bots v.3, написанном Xpert‘ом. Этот мод отлично защищал от спама конференцию на phpBBGuru.net до ее перехода на phpBB3 и защищает многие другие вплоть до сего момента.
А вот полей-призраков я еще нигде не встречал. Возможно, прохлопал ушами, но до сих пор я нигде ничего похожего не видел.