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

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

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


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

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


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

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

Рассмотрим основные способы защиты форм от спама при помощи JavaScript. Первый самый надежный, но самый громоздкий, заключается в отрисовке через document.write всей формы целиком. При грамотном использовании этого способа спамботы даже не будут знать о наличии формы на вашем сайте. Минус в том, что этот способ подходит только для небольших форм из нескольких полей и не всегда может быть использован в шаблонных сайтах.
<script type="text/javascript">
document.write(&apos;<fo&apos; + &apos;rm action="gue&apos; + &apos;st.php?add=1" met&apos; + &apos;hod="post">&apos;);
document.write(&apos;Имя: <inp&apos; + &apos;ut type="te&apos; + &apos;xt" name="user&apos; + &apos;name"><br>&apos;);
document.write(&apos;Сообщение:<br><text&apos; + &apos;area name="mes&apos; + &apos;sage" cols="20" rows="10">&apos;);
document.write(&apos;<\/tex&apos; + &apos;tarea>&apos;);
document.write(&apos;<br><in&apos; + &apos;put type="sub&apos; + &apos;mit" value="Отправить">&apos;);
document.write(&apos;<\/fo&apos; + &apos;rm>&apos;);
</script>

Второй способ, который я обычно использую в своих проектах, заключается в том, что в форме присутствует определенное секретное поле с предустановленным значением. При отрисовке страницы или отправке формы его значение заменяется на другое. Если в обработчик формы приходят данные с первоначальным значением секретного поля, то они просто игнорируются. Пример формы:
<form name="guest" action="guest.php?add=1" method="post">
  <input type="hidden" name="nospam" value="nospam">
  Имя: <input type="text" name="username"><br>
  Сообщение:<br>
  <textarea name="message" cols="20" rows="10"></textarea><br>
  <input type="submit" value="Отправить">
</form>
 
<script type="text/javascript">
  // Установить правильное значение секретного поля
  document.guest.nospam.value="OK";
</script>
И фрагмент обработчика для этой формы:
Code (PHP) : Убрать нумерацию
if ($_POST[&apos;nospam&apos;]=="OK") {
  // Добавить сообщение в гостевую
}
else {
  // Это автосабмиттер, проигнорировать
}

Обратите внимание, что скрипт замены значения поля должен находиться после формы. Как вариант можно назначить скрипт подмены значения на кнопку отправки формы. Заодно можно добавить в него другие полезные действия, например проверку заполнения имени пользователя. В этом случае скрипт должен находиться до формы.
<script type="text/javascript">
function do_submit(form) {
  // Полезная нагрузка - проверка заполнения имени пользователя
  if (form.username.value=="") {
    alert(&apos;Введите имя пользователя!&apos;);
  }
  else {
    // Установить правильное значение секретного поля
    form.nospam.value="OK";
    // Отправить форму
    form.submit();
  }
}
</script>
 
<form action="guest.php?add=1" method="post" onsubmit="return false;">
  <input type="hidden" name="nospam" value="nospam">
  Имя: <input type="text" name="username"><br>
  Сообщение:<br>
  <textarea name="message" cols="20" rows="10"></textarea><br>
  <input type="button" value="Отправить" onclick="do_submit(this.form);">
</form>
Если вы хотите, чтобы спамботы вообще не тревожили ваш сайт, отправляя пусть неверные, но все равно какие-то данные, то воспользуйтесь третьим способом. Он очень похож на второй способ, но заменяется не значение поля, а адрес обработчика формы при отправке. По умолчанию там выставлено левое значение, например about:blank или посторонний сайт.
Code (HTML) : Убрать нумерацию
<script type="text/javascript">
function do_submit(form) {
  // Полезная нагрузка - проверка заполнения имени пользователя
  if (form.username.value=="") {
    alert(&apos;Введите имя пользователя!&apos;);
  }
  else {
    // Установить правильное значение обработчика формы
    form.action="guest.php?add=1";
    // Отправить форму
    form.submit();
  }
}
</script>
 
<form action="about:blank" method="post" onsubmit="return false;">
  Имя: <input type="text" name="username"><br>
  Сообщение:<br>
  <textarea name="message" cols="20" rows="10"></textarea><br>
  <input type="button" value="Отправить" onclick="do_submit(this.form);">
</form>
Также третий способ можно усилить вторым.
Code (HTML) : Убрать нумерацию
<script type="text/javascript">
function do_submit(form) {
  // Полезная нагрузка - проверка заполнения имени пользователя
  if (form.username.value=="") {
    alert(&apos;Введите имя пользователя!&apos;);
  }
  else {
    // Установить правильное значение обработчика формы
    form.action="guest.php?add=1";
    // Отправить форму
    form.submit();
  }
}
</script>
 
<form name="guest" action="about:blank" method="post" onsubmit="return false;">
  <input type="hidden" name="nospam" value="nospam">
  Имя: <input type="text" name="username"><br>
  Сообщение:<br>
  <textarea name="message" cols="20" rows="10"></textarea><br>
  <input type="button" value="Отправить" onclick="do_submit(this.form);">
</form>
 
<script type="text/javascript">
  // Установить правильное значение секретного поля
  document.guest.nospam.value="OK";
</script>

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

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

Напомню, что все написанное является личным мнением автора и может не совпадать с чьим-то еще. "Ну... это нормально!" :)
Добавлено: 01 Января 2015 13:17:49 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...