Ne v kontakte Asocial programmer's blog

Концепция человечной защиты от ботов.

Мое активное присутствие в интернете можно отсчитывать с 6 апреля 2005, когда я впервые установил phpBB 2.0.13 на свой компьютер с целью “поиграться”. И с тех пор этот движок занимает достаточно важную часть моей жизни. Соответственно, занимаясь форумами, мне приходилось сталкиваться с разными видами спама и защиты от него. Среди последних были и эффективные, и не очень. Ниже я постараюсь изложить метод защиты от спама, который  должен сбивать с толку ботов и без проблем проходиться человеком.

Базовая идея.

Боты пользуются большим распространением небольшого количества известных движков. Научился работать с одним из них - получил возможность спамить по десяткам тысяч ресурсов. С другой стороны, каким бы навороченным не был пятый хрумер - даже двадцать пятый не сможет оценивать смысловую составляющую  формы регистрации/постинга, как это делает человек.

Соответственно, наша задача - сделать форму непонятной для бота.

Техническая сторона.

Бот имеет возможность вычленять по определенным сигнатурам те или иные части страницы и анализировать их, определяя назначения полей или типы защиты. Чаще всего он ориентируется на имена полей, реже - на их порядок, совсем редко - на располагающиеся рядом подписи.

Таким образом, чтобы отсеять абсолютное большинство ботов, мы должны разрушить хотя бы два первых ориентира.

Для первого вариант прост: имена полей формы должны быть уникальны для каждого экземпляра движка. Это можно достигнуть путем привязки к домену, а так же использование некоторого случайного числа, которое будет генерироваться при установке. Затем можно проделывать какое угодно количество хеширований (формулу хеширования тоже, кстати, можно сделать динамической) и пропускать имена всех полей через оные процедуры.

Со вторым вариантом, чтобы не осложнять жизнь людям, чуть сложнее, но лишь чуть. Выходом будет случайное разбрасывание по всей форме дополнительных полей-призраков со своими уникальными именами, скрытых при помощи JS или CSS от глаз людей. Чем больше такого мусора - тем больше шанс запутать бота. Заполнение хотя бы одного из таких полей будет сигналом для срабатывания защиты.

Как вариант, этим полям можно по умолчанию давать какие-то значения и сверять их при обработке формы.

На последний пункт сложнее всего влиять, поскольку подписи к формам необходимы в первую очередь людям, но и тут есть выход. К полям-призракам можно добавлять подписи, дублирующие подписи нормальных полей. Тогда боту придется угадывать правильное поле и чем больше полей-призраков, тем меньше у него шансов.

Больше крови!

Чтобы окончательно посадить спамеров на бобы, можно генерировать уникальные имена полей и расположение полей-призраков для каждой сессии.

Человеческая сторона.

Замечательность такого подхода, на мой взгляд, состоит в том, что человек даже не заметит присутствия антиспама, если его, конечно, не понесет читать исходный код страницы.

Реализация.

Подход, связанный с переименованием полей используется в моде для phpBB2 Stop Advertisement Bots v.3, написанном Xpert‘ом. Этот мод отлично защищал от спама конференцию на phpBBGuru.net до ее перехода на phpBB3 и защищает многие другие вплоть до сего момента.

А вот полей-призраков я еще нигде не встречал. Возможно, прохлопал ушами, но до сих пор я нигде ничего похожего не видел.