Как я избавился от спама в комментариях

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

Ручной спам — за копейки нанимаются школьники, которые самостоятельно заходят в блог и оставляют комментарий. С таким спамом бороться тяжело. Но к счастью его мало.

Автоматизированный спам — спам отправляется с помощью специальных скриптов без участия человека в момент отправки сообщения.

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

Однако, это уже в прошлом. Спамеры обходят капчу двумя путями:
1) программно. Проще говоря, скрипт разгадывает текст на изображении и сообщение отправляется без ошибок.
2) нанимают опять же школоту, которая разгадывает капчу на лету. Самый известный сервис — antigate.com
Происходит это следующим образом. Скрипт обращается на страницу с формой отправки комментария, сканирует поля формы и забирает картинку с капчей. Эта картинка тут же отображается в личном кабинете кого-то школьника (или индуса, или китайца), который ее распознает. Этот процесс занимает от нескольких секунд, до нескольких минут (если поток заданий большой, а кол-во школьников в онлайне мало). За каждые 1000 распознанных картинок он получает 1-3$ (цены возможно изменились, но всё равно копейки).

У меня у самого раньше стояла капча на сложение чисел (плагин Math для Wordpress). Но спам всё равно проходил, видимо роботы научились определять подобную защиту и складывать числа.

Решение без капчи

Есть простой способ отличать живых пользователей от роботов. Впервые этот способ я применил на своей старой работе, когда сайты попали в спамерские базы и пошел просто вал спама. Сразу скажу, что идея не нова и ничего волшебного в ней нет. В момент нажатия на кнопку "Отправить" происходит javascript-событие onsubmit. Роботы же не поддерживают javascript (во всяком случае большинство).

Суть метода:

  1. добавляем какое-то скрытое поле в форму. допустим, со значением value="abc"
  2. при событии onsubmit меняем его значение допустим на value="abcde"
  3. на сервере проверяем значение скрытого поля. Если оно равно "abcde", то всё хорошо. Если нет, значит либо это робот, либо у пользователя отключен javascript.

Полный пример кода

<?php
// обработка формы на стороне сервера
if (isset($_POST['submit'])) {
	if ($_POST['hash'] != 'abcde') {
	     echo 'Вы робот или у вас не работает javascript';
 	     exit();
	}
	else {
	     echo $_POST['text']; // что-то делаем с отправленными данными
	}
}
?>

<script type="text/javascript">
// функция, которая изменяет скрытое поле в момент отправки формы
function setHash() {
	document.getElementById("hash").setAttribute("value", "abcde");
}
</script>

<form method="post" action="" onsubmit="return setHash()">
        <textarea name="text"></textarea>
	<input type="hidden" name="hash" id="hash" value="abc" />
	<input type="submit" name="submit" value="Отправить">
</form>

Код упрощен. В нем нет защиты от CSRF и проверки на валидность данных. Но это легко дописать.

Минусы

1) Данный способ применим только на малоизвестных сайтах. Для крупных сайтов пишутся специальные скрипты, которые могут обходит такую защиту. Проще говоря, спамер просто посмотрит алгоритм javascript-функции и реализует его в своей программе.

2) код не работает, если отключен javascript. В эпоху web 2.0 таких пользователей крайне мало. Например, без javascript не получится залогиниться в Контакт.

Теги: javascript, спам
#1

Всё намного проще: Akismet.

Руслан, 25.06.2013 - 12:05
#2

Роботы поддерживают яву, кроме самых динозавров.

Max, 25.06.2013 - 13:15
#3

как показывает практика большинство не поддерживает.

admin, 25.06.2013 - 14:48
#4

Мы вот так на auto.ria.ua делали http://habrahabr.ru/post/27756/
вполне себе способ, работает до сих пор.

Гена, 25.06.2013 - 17:12
#5

Спам-бот :)

Спам-бот, 16.07.2013 - 17:23
Оставить комментарий