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

Alek$ ср, 07/01/2019 - 23:40

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Реализация.

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

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



Trackback URL for this post:

/trackback/298
Denis` вт, 13/01/2019 - 12:41

Отличная статья и отличная идея! Спасибо!
А реализацию можно где-нибудь посмотреть?

Alek$ ср, 14/01/2019 - 13:55

Ссылку на частичную реализацию для phpBB2 я дал в конце поста. Более полных вариантов я не встречал.

Гость сб, 04/04/2019 - 16:31

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

Alek$ вс, 05/04/2019 - 12:56

Поудалять все трояны, поменять пароли.



Отправить комментарий

CAPTCHA
Вы точно не бот?
9 + 12 =
Without JavaScript you won't pass captcha test, sorry. Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.