Blog. Just Blog

Защита от спама на сайтах и форумах

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Проблема спама в комментариях, гостевых книгах, сообщениях на форумах в настоящее время стоит очень остро. Раньше даже простенькая капча или подтверждение регистрации на форуме по e-mail были практически непреодолимым препятствием для спамботов и автосабмиттеров. Теперь появились достаточно мощные программы для авторегистрации и рассылки спама, способные реально обходить эти защиты. Никаких названий и ссылок на сайты указывать не буду, чтобы не делать рекламы этим ублюдкам. В описании одного из спамботов его аффтар хвалится:


Эксклюзивная возможность - программа обходит ЛЮБЫЕ виды защиты от автоматической регистрации и автосабмита! Такие, как:
- Защита при помощи пиктокода (тикетов) типа "Введите число, которое видите".
- Защита при помощи активации по e-mail.
- Защита при помощи некоторых Java-скриптов.
- Возможность распознавания защиты в виде арифметических операций и логических вопросов


а на следующей же страничке расписывается в своей беспомощности:


Изредка на некоторых форумах встречается защита от автосабмита в виде java- или VB-скрипта.
Как показала практика, чтобы научить программу обходить такого рода защиту, совсем необязательно писать полнофункциональный обработчик скрипта. Главное, чтобы такой вид защиты был достаточно распространён: нецелесообразно создавать обработчик, если такая защита используется только на одном-двух форумах.


Значит наш удар будет нанесен в самое слабое место спамботов - невозможность обрабатывать формы, защищенные при помощи скриптов JavaScript. Лично я противник использования на сайтах различных навороченных капчей, которые не то что робот, а и не каждый здоровый человек разберет. После первого же неправильного ввода желание оставлять комментарий, да и вообще посещать подобный ресурс, очень резко уменьшается. Туда же идут всякие "сколько будет 2+3", "что нарисовано на картинке" и прочие лишние телодвижения, не связанные непосредственно с комментированием.

Использование JavaScript совершенно прозрачно для пользователя, выполняется в фоновом режиме и никак не отражается на дизайне сайта. Единственный минус в том, что пользователи-параноики с отключенными "в целях безопасности" скриптами не смогут оставить комментарий или зарегистрироваться на вашем форуме. А вам нужны такие параноики на сайте? Лично мне нет :) К тому же сейчас ни один серьезный сайт не обходится без использования JavaScript в своем основном функционале. Эффективность данного способа подтверждена на практике. За несколько лет существования всех моих подопечных форумов и сайтов, после установки защиты на них не появилось ни одного автоматически добавленного рекламного сообщения или комментария. Хотя ежедневно мне на почту приходят отчеты моих систем безопасности о нескольких десятках проявлений активности спамботов. Понятное дело, что против ручного размещения спама ничего не поможет, но такие клинические случаи встречаются очень редко и разруливаются обычным баном.

Рассмотрим основные способы защиты форм от спама при помощи JavaScript. Первый самый надежный, но самый громоздкий, заключается в отрисовке через document.write всей формы целиком. При грамотном использовании этого способа спамботы даже не будут знать о наличии формы на вашем сайте. Минус в том, что этот способ подходит только для небольших форм из нескольких полей и не всегда может быть использован в шаблонных сайтах.
  1. <script type="text/javascript">
  2. document.write('<fo' 'rm action="gue' 'st.php?add=1" met' 'hod="post">');
  3. document.write('Имя: <inp' 'ut type="te' 'xt" name="user' 'name"><br>');
  4. document.write('Сообщение:<br><text' 'area name="mes' 'sage" cols="20" rows="10">');
  5. document.write('<\/tex' 'tarea>');
  6. document.write('<br><in' 'put type="sub' 'mit" value="Отправить">');
  7. document.write('<\/fo' 'rm>');
  8. </script>
Второй способ, который я обычно использую в своих проектах, заключается в том, что в форме присутствует определенное секретное поле с предустановленным значением. При отрисовке страницы или отправке формы его значение заменяется на другое. Если в обработчик формы приходят данные с первоначальным значением секретного поля, то они просто игнорируются. Пример формы:
  1. <form name="guest" action="guest.php?add=1" method="post">
  2.   <input type="hidden" name="nospam" value="nospam">
  3.   Имя: <input type="text" name="username"><br>
  4.   Сообщение:<br>
  5.   <textarea name="message" cols="20" rows="10"></textarea><br>
  6.   <input type="submit" value="Отправить">
  7. </form>
  8.  
  9. <script type="text/javascript">
  10.   // Установить правильное значение секретного поля
  11.   document.guest.nospam.value="OK";
  12. </script>
И фрагмент обработчика для этой формы:
  1. if ($_POST['nospam']=="OK") {
  2.   // Добавить сообщение в гостевую
  3. }
  4. else {
  5.   // Это автосабмиттер, проигнорировать
  6. }
Обратите внимание, что скрипт замены значения поля должен находиться после формы. Как вариант можно назначить скрипт подмены значения на кнопку отправки формы. Заодно можно добавить в него другие полезные действия, например проверку заполнения имени пользователя. В этом случае скрипт должен находиться до формы.
  1. <script type="text/javascript">
  2. function do_submit(form) {
  3.   // Полезная нагрузка - проверка заполнения имени пользователя
  4.   if (form.username.value=="") {
  5.     alert('Введите имя пользователя!');
  6.   }
  7.   else {
  8.     // Установить правильное значение секретного поля
  9.     form.nospam.value="OK";
  10.     // Отправить форму
  11.     form.submit();
  12.   }
  13. }
  14. </script>
  15.  
  16. <form action="guest.php?add=1" method="post" onsubmit="return false;">
  17.   <input type="hidden" name="nospam" value="nospam">
  18.   Имя: <input type="text" name="username"><br>
  19.   Сообщение:<br>
  20.   <textarea name="message" cols="20" rows="10"></textarea><br>
  21.   <input type="button" value="Отправить" onclick="do_submit(this.form);">
  22. </form>
Если вы хотите, чтобы спамботы вообще не тревожили ваш сайт, отправляя пусть неверные, но все равно какие-то данные, то воспользуйтесь третьим способом. Он очень похож на второй способ, но заменяется не значение поля, а адрес обработчика формы при отправке. По умолчанию там выставлено левое значение, например about:blank или посторонний сайт.
  1. <script type="text/javascript">
  2. function do_submit(form) {
  3.   // Полезная нагрузка - проверка заполнения имени пользователя
  4.   if (form.username.value=="") {
  5.     alert('Введите имя пользователя!');
  6.   }
  7.   else {
  8.     // Установить правильное значение обработчика формы
  9.     form.action="guest.php?add=1";
  10.     // Отправить форму
  11.     form.submit();
  12.   }
  13. }
  14. </script>
  15.  
  16. <form action="about:blank" method="post" onsubmit="return false;">
  17.   Имя: <input type="text" name="username"><br>
  18.   Сообщение:<br>
  19.   <textarea name="message" cols="20" rows="10"></textarea><br>
  20.   <input type="button" value="Отправить" onclick="do_submit(this.form);">
  21. </form>
Также третий способ можно усилить вторым.
  1. <script type="text/javascript">
  2. function do_submit(form) {
  3.   // Полезная нагрузка - проверка заполнения имени пользователя
  4.   if (form.username.value=="") {
  5.     alert('Введите имя пользователя!');
  6.   }
  7.   else {
  8.     // Установить правильное значение обработчика формы
  9.     form.action="guest.php?add=1";
  10.     // Отправить форму
  11.     form.submit();
  12.   }
  13. }
  14. </script>
  15.  
  16. <form name="guest" action="about:blank" method="post" onsubmit="return false;">
  17.   <input type="hidden" name="nospam" value="nospam">
  18.   Имя: <input type="text" name="username"><br>
  19.   Сообщение:<br>
  20.   <textarea name="message" cols="20" rows="10"></textarea><br>
  21.   <input type="button" value="Отправить" onclick="do_submit(this.form);">
  22. </form>
  23.  
  24. <script type="text/javascript">
  25.   // Установить правильное значение секретного поля
  26.   document.guest.nospam.value="OK";
  27. </script>
Для защиты от спама ваших форумов и сайтов на готовых движках вы должны модифицировать формы регистрации новых пользователей и формы добавления сообщений, а также скрипты-обработчики переданных из них данных. Скрипты и правильные значения секретных полей можно немного зашифровать или вообще изменить до неузнаваемости. Но об этом попозже будет подготовлена отдельная статья. Также контрольные значения можно менять динамически, например делать равным сегодняшнему числу месяца.

И не забывайте о параноиках с отключенными скриптами, их надо предупреждать о том, что они не правы. Содержимое html-тега noscript отображается только когда в браузере отключены скрипты:
  1. <!-- Cообщение будет показано только при отключенных скриптах -->
  2. <noscript>
  3.   <span style="color:#FF0000;">
  4.   Ваш браузер не поддерживает JavaScript или в нем
  5.   отключена поддержка скриптовВы не сможете оставить комментарий.
  6.   </span>
  7. </noscript>
Напомню, что все написанное является личным мнением автора и может не совпадать с чьим-то еще. "Ну... это нормально!" :)

Поделиться ссылкой ВКонтакте
Просмотров: 31045 | Комментариев: 64

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ФЧ (22.12.2016 в 13:53):
Спасибо за науку
Михаил (08.08.2014 в 22:26):
ManHunter, да я не путаю :) В реальной ситуации можно легко пропустить этот момент когда нет контроля по времени между запросами. И тогда сайт будет загажен. А вообще я за каптчу :)
ManHunter (08.08.2014 в 22:01):
Не путай мягкое и теплое. Естественно, что все отображаемое в браузере можно так или иначе эмулировать, и "спам" (в кавычках) был отправлен с одной единственной системы с заведомо известными параметрами. Не говоря уже о том, что в реальной ситуации был бы выписан ручной бан сразу же после первого спамерского сообщения. А вот автоботы как шесть лет сосали, так и сосут.
Михаил (08.08.2014 в 21:53):
не я не претендую на алгоритмы :) просто у тебя тут написано что секретное поле должно меняться. Куки я удалял, а секретное поле остается прежним...

ManHunter, да и порядка 10 спамов пролезло к тебе :) и отобразились на сайте
ManHunter (08.08.2014 в 21:46):
Ну неужели ты думаешь, что я в статье буду расписывать все секреты и все технологии, которые используются на этом сайте? :) Автоматического спама нет? Нет. Факт. А уж какими средствами это достигнуто, это уже пусть каждый сам гадает.

Чуть не забыл. Спасибо за тестирование! :)
Михаил (08.08.2014 в 21:41):
что то я не вижу чтоб менялась comment_ns

это что какой то md5 от IP с именем браузера и какой-нибудь солью?

А тут говорится что должно меняться...

При отрисовке страницы или отправке формы его значение заменяется на другое. Если в обработчик формы приходят данные с первоначальным значением секретного поля, то они просто игнорируются.
ManHunter (08.08.2014 в 17:05):
Ну получишь ты ответ ERROR, и чем это поможет :) Это я пока не включил автобан по интервалу между сообщениями, все было бы гораздо веселее.
Михаил (08.08.2014 в 16:59):
ManHunter, да и даже бы если бы менялись, ничего не стоит получить ответ от http://www.manhunter.ru/ajax.php, найти то что нужно и заполнить соответствующие поля и отправить запрос по новой...

аа блин так их надо просто менять что ли?
ManHunter (08.08.2014 в 16:57):
Ключевые слова "в моем случае".
Михаил (08.08.2014 в 16:56):
это мой месседж 0

это мой месседж 57

не знаю но у вас не меняются значения вот этих полей никак вообще в моем случае

<input type="hidden" value="53" name="comment_article">
<input id="comment_key" type="hidden" value="a554d77d5a1aa3e3b5c3cdc541fec284" name="comment_key">
<input id="comment_ns" type="hidden" value="bbaed92eef5e376092c8da8d3bd0c7a9" name="comment_ns">
ManHunter (08.08.2014 в 16:45):
Создалось ровно то, что в камментах, ни строчкой больше.
Михаил (08.08.2014 в 16:44):
ManHunter, а в базе то что то создалось? не понимаю почему пролезли тут только 0 и 59
ManHunter (08.08.2014 в 16:43):
Нет, тут же пока все по-доброму. Мне лишнее тестирование тоже не помешает, расслабляться в наше время нельзя.
Михаил (08.08.2014 в 16:41):
это мой месседж 0

это мой месседж 59

ManHunter, все уже забанили? :)
Михаил (08.08.2014 в 15:35):
Ну ок, если без обид :)
ManHunter (08.08.2014 в 15:31):
Думаешь на этом сайта стоит только такая защита от спама? Пробуй, жалко что ли.
Михаил (08.08.2014 в 15:22):
вот этот вот?
Спамеры как сосали, так и продолжают сосать. За шесть лет еще ни одного автоматического каммента добавить не удалось.

могу попробовать нагадить 1000 коментов :)

так ради спортивного интереса :)
ManHunter (08.08.2014 в 15:13):
Угу, слабЕнькая. Только сперва прочитай мой предыдущий комментарий.
Михаил (08.08.2014 в 15:11):
Слабинькая защита, от тупого спам бота спает, а вот от продуманной мпам атаки нет...
ManHunter (19.07.2014 в 00:17):
Спамеры как сосали, так и продолжают сосать. За шесть лет еще ни одного автоматического каммента добавить не удалось.
Mike (16.10.2013 в 16:03):
Отлично.
Rrinna (10.09.2012 в 00:42):
Мерси. Просто и эффективно
ManHunter (06.04.2012 в 16:13):
Идешь на форум или в саппорт DLE, спрашиваешь там. Они за это бабло получают, вот пусть и отрабатывают.
Евгений (06.04.2012 в 16:11):
Подскажите, как внедрить второй способ в CMS DLE 9.3? Уже замучился искать...
Андрей (04.01.2012 в 07:53):
Спасибо, классный материал, долго искал как защитить свой сайт от назойливых ботов. Установил защиту с помощью java вашим способом. Все работает.
Андрей (14.12.2011 в 10:30):
Ну например так
<script>
function spam(a){
b='введи текст';
lena=a.length;
sps='<>&$/?#%';
t=0;
for (i=0;i<lena;i++){
t=sps.indexOf(a.charAt(i));
if (t>0){
break;
document.fr.subs.value='запрещенный символ'}
}
;
if (a==b || t>0){
document.fr.texts.focus();
}
else{
document.fr.subs.disabled=0;
document.fr.subs.value='Отправить'
}   
}
</script>
Андрей (13.12.2011 в 16:58):
кстати гугловский хром в просмотре элемента показывает результат отработки скрипта поэтому отрисовка об отрисовке форм можно не париться бесполезно
ManHunter (13.12.2011 в 16:54):
Согласен, мысль с onfocus/onclick неплохая
Андрей (13.12.2011 в 16:50):
можно метод использовать типа потерял фокус проверить что введено, если введена лажа или фокус не терялся, то обнуляем поле ввода. По моему тоже должно работать причем без отправки серверу и нажатия саба :)
Алекс (27.11.2011 в 21:24):
Спасибо!
Василий Пупкин (03.06.2011 в 03:48):
Очень интересно!
morgot (25.05.2011 в 14:33):
Да, эта защита довольно геморойная, когда-то кодил скрипт регистрации под такое, за неделю  с трудом сделал. Но с другой стороны - обошел ее, и не надо тратиться на обход капчи. Вроде как, что-то похожее стоит в yahoo, хотя могу ошибаться..
з.ы. чтобы не было поливания говном в комментах, я спамом не занимаюсь, просто надо было 1 кидале зафлудить ресурс.
comm (20.04.2011 в 14:53):
Суть да, но подход иной. В предложенных алгоритмах, поля скрываются от бота, а в подходе от Никиты (по ссылке), они наоборот скармливаются боту как наживка, на которую бот клюет.
ManHunter (20.04.2011 в 14:33):
Этот способ по сути ничем не отличается от способов из статьи. Те же скрытые поля, значение которых проверятся после сабмита.
comm (20.04.2011 в 14:25):
Копал про защиту от ботов, нашел еще один из вариантов защиты: это применение популярных полей типа email,  как приманки с проверкой на установленное значение. Если значение есть, то бот. Говорят что ни один бот не прошел такую защиту. Что можно использовать как третий каскад защиты к двум опубликованным.

Нашел здесь: http://outcoldman.ru/ru/blog/s...#comment_552
pomagite nastroit (16.01.2011 в 17:16):
pomagite nastroit! pishite   Beluha_260590@mail.ru
Павел (07.09.2010 в 02:11):
Спасибо, отличная статья!
ManHunter (01.09.2010 в 17:12):
Victor, это чо бы вдруг не усилен? Адрес формы подменяется при отправке, секретное поле выставляется. Или код настолько сложен для восприятия?
Victor (01.09.2010 в 17:03):
"Также третий способ можно усилить вторым."

На самом деле в коде не усилен. Поэтому после добавления в код этот комментарий можно удалить.

Спасибо за статьи.
Роман (18.08.2010 в 18:59):
А вот тут загвоздочка:
if (form.username.value=="")

Можно ввести несколько пробелов - "  " и проверка пропустит дальше.
DarkSoul (17.06.2010 в 16:04):
Отличная статья, спасибо!
AlexNZ (28.05.2010 в 14:34):
"В этом случае скрипт должен находиться до формы."
Нет. В этом случае, абсолютно одиноково где будет расположет ваш js-код.

И всё же лучше блокировать js до полной загрузки страницы, тому пример практика использования jQuery:
$(document).ready(function(){
/* здесь код выпонится после загрузки всей страницы */
});
ManHunter (28.05.2010 в 14:29):
Да способов куча, только нужно ли специально что-то усложнять, если можно обойтись простыми методами? Когда проломят эту защиту - буду думать дальше, а пока уже несколько лет спам не проходит, и меня это вполне устраивает.
AlexNZ (28.05.2010 в 14:26):
Вот идея.
Есть кнопка "Оставить комментарий". По нажатию, через AJAX, форма загружается в поготовленный div (или другой DOM элемент). Форму тоже можно отправлять через AJAX.
Если вам свовсем скучно, можете пообщаться ajax'ом с сервером прежде чем отправить форму. К примеру, получить что-то в виде подтверждения или получить код для изменения hidden части формы, URL для submit'а ... :-)
Javascript код имеет смысл разнести по нескольким .js файлам. Совместно с другими методами защиты это будет серьёзной проблемой для ботов.

А вообще, из начала статьи ясно, что если защита ваша "оригинальна", т.е. но других сайтах такой нет, то писать для неё взлом большого смысла нет (ну разве что ваш обиженый приятель, окажется серьёзным программистом и подлецом одновременно).
Online (03.04.2010 в 19:14):
Спасибо большое! Интересное решение. использовал на своем сайте (второй способ с ява скриптом) в скрипте отправки комментариев к фильмам - работает уже месяц, пока спама не наблюдается :))
ManHunter (29.03.2010 в 22:43):
Все именно так. А обид нет, есть blacklist.
Кое-кто в пальто (29.03.2010 в 22:34):
ManHunter, помоему у тебя ЧСВ зашкаливает. Без обид.
Использовать способ защиты, для которого необходим включенный яваскрипт у юзера, на сайтах вроде этого - можно. Но если говорить о проектах, например, сайт, вроде ленты.ру, где можно комментировать новости, то такой способ неприемлем.
ManHunter (16.03.2010 в 23:37):
Я очень долго подбирал нужное слово, из всего списка "параноик" мне показалось наименее обидным. А отчеты - это сбор информации, чтобы всегда быть на шаг впереди таких как ты.
Zordon (16.03.2010 в 23:28):
а почему вы называете параноиков тех, кто отключил JavaScript?
а ежедневные отчёты на почту - это не параноя?))
maxeg (12.03.2010 в 10:18):
Спасибо. Очень дельная статья.
ManHunter (22.02.2010 в 16:58):
sharovatov, лучше я не получу 1 комментарий от какого-нибудь параноика с отлюченными скриптами, чем буду фильтровать 10000 камментов от спамботов или же буду заставлять нормальных людей распознавать всякие трехмерные капчи с логарифмами. Так что для себя я приоритеты расставил. Мне совершенно наплевать на проблемы и неудобства всех параноиков, которые отключают скрипты на моих сайтах.
dervan (22.02.2010 в 12:06):
sharovatov, делать защиту на внешних бесплатных сервисах (Akismet, reCAPTCHA, ...) - считаю, спорное решение. Минусов хватает. Во-первых, зависимость безопасности сайта от внешних сервисов, которые могут либо висеть, либо работать непозволительно долго, либо их могут взломать. Во-вторых, востребованные бесплатные сервисы могут стать платными (вспомним Webcron), так что использовать их в заказных проектах чревато. В-третьих, эти сервисы ориентированы на английский язык, так что они могут быть очень некомфортными для пользователей рунета.

ManHunter, большое спасибо за статью.
sharovatov (15.02.2010 в 23:31):
А как быть с теми, у кого js отключён (или пользователей расширения noscript)? Вы предлагаете им не давать возможность комментировать вовсе... Для некоторых проектов, возможно, это подойдёт как решение, но, по-хорошему, стоит посмотреть в сторону "нормальных" антиспам-решений вроде akismet. А уже прорывающихся спамеров банить.
ManHunter (29.01.2010 в 17:38):
Никак. JS - это не тот язык, на котором можно что-то спрятать.
ВИКТОР (29.01.2010 в 17:37):
СУППЕР!!!
А как еще сделать чтобы исходный текст файлов javascript не могли просмотреть, а то если в браузере набрать можно без труда взглянуть на исходник...???
ыы (06.01.2010 в 17:47):
Я немного наподобие сделал на дле. Добавил в js_edit.js функцию, в которой генерится спец. форма с определенным значением. В файлы, отвечающие за отправку данных(addcomments, addnews и т.д.) добавил условие, редирект на главную при несоответствии значения в форме. В нужные шаблоны вставил <script>get_robot();</script>, вызов функции моей. +Еще js_edit закодирован, распарсить не получится просто так. 3-4 апа хрума продержится такая защита :)
gafarum (19.08.2009 в 18:01):
Спасибо.
Ты делаешь благое дело!
ManHunter (16.07.2009 в 15:23):
Никак не можно. И это не сборка, а полностью авторская разработка, написанная с нуля.
Василий (16.07.2009 в 15:15):
Спасибо за статью. Весь блог уже облазил, отличный материал.
Вопрос к автору - можно как то получить (скачать) именно вашу сборку скрипта блога? мое мыло если что -  secondmoney (пЁс) gmail.com
walker (16.07.2009 в 03:05):
Грамотно!
привет (21.05.2009 в 06:25):
просто хочу посмотреть как работает
Mitya (10.04.2009 в 19:30):
Спасибо! Очень толково.
RussPro (19.03.2009 в 00:16):
Спасибо за статью ManHunter.
KOT (01.02.2009 в 00:58):
Спасиб помогло :)

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0062 сек.) / Память: 4.5 Mb
Наверх