CB's blog

О борьбе со спамом

Август 17, 2006

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

Немного общих фраз

Итак, как же спаммеры проникают в нашу жизнь? Во-первых, конечно, они страраются залезть (и напихать побольше гадости) в наши электронные почтовые ящики. Что можно посоветовать в этом случае пользователям? Наверное, не стоить писать адрес своей электронной почты в публичных местах, типа форумах. Есть много программ, которые анализируют тексты веб-страничек для поиска имейлов. Потом эти адреса передаются сами знаете каким людям. Какими способами можно писать имейлы неявно, можно почитать здесь. Также стоить обратить внимание на поставщика услуг электронной почты. Я, например, использую gMail и вполне доволен его спам-фильтрами. Если у Вас какой-нибудь корпоративный ящик и часто приходят "плохие" письма - стоит обратиться к админу.

Во-вторых (после почтового спама), многим из нас (тем, у кого есть блоги, просто сайты, гостевухи и т. п.) приходит спам в комментариях. Хочется немного поделиться своим опытом для этого случая.

Многие из нас неоднократно видели на солидных (и даже не очень) сайтах небольшие картинки, на которых изображени буквы или цифры, притом на грязном фоне или с сильно деформированными контурами, а рядом - текстовое поле, куда надо ввести эти самые зашифрованные письмена. И все это для того чтобы, например зарегистрироваться или добавить комментарий на сайт. Так вот, такая технология называется CAPTCHA (completely automated public Turing test to tell computers and humans apart), о ней можно почитать, например, в Википедии. Вратце, этот подход применяется чтобы сбить с толку роботов-спаммеров (практически весь спам рассылается автоматически), картинки же слишком сложные для того чтобы их автоматически "прочитать". CAPTCHA можно считать достаточно надежным средством защиты от спама. В то же время, есть и небольшие недостатки. В первую очередь, это сложность реализации (ели по всем правилам) типа генерации картинок на лету и т. п., к тому же возрастает траффик, плюс иногда CAPTCHA прочитать сложно даже людям с хорошим зрением.

Возможно будет полезен другой подход. Его суть - во фразе "Если Вы не робот - очистите поле". То есть вводится дополнительное текстовое поле, по дефолту непустое, на сервере (или +на клиенте) проверяется очислил ли пользователь это поле, если не очистил - большая вероятность что он робот (или не умеет читать по-русски, или невнимателен). В последнее время все чаще такой подход можно встретить на наших сайтах. Простота реализации, удобность для пользователей - безусловные плюсы. Минус - неопределенная надежность, так как роботов можно сравнительно несложно научить этому трюку.

Защита Wordpress

Ну и теперь конкретно по Wordpress. Это один из самых популярных блог-движков, потому он наверное и лучше всего изучен спаммерами. Роботы без проблем генерируют валидные имейлы, ели это обязательное поле и т. п. Дальше я опишу, как можно защитить Ваш Вордпресс от спама, потратив всего 5 минут. Дальше считаю, что читатель немного знает PHP и HTML, и имеет доступ к файлам Wordpress на сервере.

Для добавления защиты, понадобится модификация 2х файлов: comments.php (это файл из темы) и wp-comments-post.php - из корневого каталога WP. В comments.php добавляем текстовое поле (например, непосредственно перед полем для тела комментария, обратите внимание на то что немного выше идет проверка типа is user logged in так что лучше добавить поле после нее):

<p><input type="text" name="comment_2x2" id="comment_2x2" value="" size="22" tabindex="4" />
<label for="comment_2x2"><small>= 2x2</small></label></p>

Я, например, предлагаю пользователю вычислить 2х2. Это довольно интернациональный, лаконичный и простой способ. Теперь в файле wp-comments-post.php добавляем проверку:

$comment_2x2 = trim($_POST['comment_2x2']);

if($comment_2x2 != 4)
   die( __('Sorry.') );

Я сделал так, если отцы PHP увидят баги, надеюсь, они меня поправят. А в целом как видим, все предельно просто. Думаю, теперь что спама станет хоть немножечко меньше. Вот и все. Делимся опытом. Жду критики.

Комментарии (8) на “О борьбе со спамом”

  1. Ragnar:

    Это как бы позитивная критика :) .
    Вот

    $comment_2x2 = trim($_POST['comment_2x2']);
    

    это не баг но не очень красиво, правильно надо делать вот так :)

    $comment_2x2 = (isset($_POST['comment_2x2']) ? intval(trim($_POST['comment_2x2'])) : false);

    Во вторых фик ето защитит от спама так как выражение постоянное поетому предлагаю модифицировать это следующим образом:

    Перед отрисовкой формы для коментов делать

    if (!isset($_SESSION['x'])) {
        $_SESSION['x'] = rand(1, 100);
        $_SESSION['y'] = rand(1, 100);
    }

    А при проверке делать следующее

    if($comment_2x2 != ($_SESSION['x'] * $_SESSION['y']) ) die( __('Sorry.') );

    Еще можно рандомить и оператор то есть юзать не только умножение.

  2. svoloshyn:

    За позитивную критику спасибо.

    Ну вот так не очень красиво я сделал потому что точно так же в движке Вордпресса обрабатываются остальные поля.

    Уровень постоянности выражения я думаю надо делать по факту появления спама. Сейчас мне спам пока роботы не шлют, так я думаю, можно не усложнять. Естественно, если нужно обеспечивать защиту от спама на более важных объектах, можно дать свободу фантазии - как в твоем случае, ИМХО умножать два числа от 1 до 100 для многих ленивцев станет затруднительно, а для некоторых будет сложно без дескрипшина догадаться что от них хотят.

  3. maximum:

    Да уж, от 1 до 100 будет слишком круто даже для матемаиков, устанешь комменты писать. ;)

  4. Blogger:

    Эти цифры-буквы на грязном фоне иногда вообще не разобрать, к сожалению. А это забавная идея - защита от роботов-спамеров математическими задачками.:-) Как в сказке, когда чтобы пройти по нужной дороге, следует отгадать загадку (или ТРИ, если не повезет).

  5. svoloshyn:

    Кстати, подобную защиту я недавно встретил при редактировании статей в Wikipedia. Не знаю, правда, как давно она там используется.

  6. Sam:

    Я у себя скрыл CSS-ом дополнительное поле. Если пустое - заполнял человек, иначе - бот.

  7. edd:

    Wordpress — какое-то невероятное гавно. Почему им все пользуются?

    Впрочем, нет. Неправильно. Давайте сначала.

    Wordpress — какое-то невероятное гавно. Поэтому им все и пользуются. Есть же куча нормальных блоговских движков. Но приживается по старой доброй традиции только гавно.

    Дело даже не в том, что оно тормозное. «Страница генерировалась 6 секунд и потребовала 28 запросов к базе», — гордо красовалось на каком-то блоге, работающем на Wordpress. 28 запросов на страницу, которая максимум требует три. Фиг с ней, с производительностью. Пусть хостер по этому поводу думает, у него голова большая. Нам, конченым юзерам, это ни к чему.

    Хуже то, что он делался без привлечения мозга и загажен фичами. Какая тупая жопа додумалась, например, делать страницу «следующая страница» с постоянным адресом (/page/2/) но непостоянным контентом? В результате содержимое огромной кучи страниц на сайте меняется после каждой публикации и поисковые системы сходят с ума. Динамический сайт, ага. Что, noindex, nofollow? Хахаха. Если бы.

  8. BergHOFF:

    >Sam:

    >Октябрь 31st, 2006 в 4:15 pm
    >Я у себя скрыл CSS-ом дополнительное поле. Если пустое - заполнял человек, иначе -> бот.
    а вот это - самая лучщая идея среди всех вышеперечисленных!

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