Антиспам своими руками


изображение потырено с Вики

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

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

Есть достаточное количество плагинов к wordpress для борьбы со спамом. Но в них нужно разбираться, они притормаживают работу сайта (иногда очень сильно) и далеко не всегда дают полный эффект.

На самом деле всё делается достаточно просто, безо всяких плагинов, своими руками.



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

Во-первых, спамят не люди. Даже пол-Индии столько бы не наспамили. Спамят боты (компьютерные программы), а простого бота обмануть легче, чем даже индуса-программиста.

Во-вторых, мой блог нафиг им не дался (особенно с премодерацией и тиц=0). Как и практически все остальные блоги и форумы. Они берут количеством. Попробовали проспамить миллион сайтов, успешными оказались только 5% попыток — уже 50 000 сайтов. Главное спамить быстро и много. Любая сложная логика значительно снижает скорость при минимальном приросте успешности. Поэтому все боты предельно тупы.

Следим за ботами

Нам понадобятся всего два файлика вордпресса:

  1. /wp-content/themes/<текущая тема>/comments.php — найдите в нём тег <FORM>, это и есть форма отправки комментария. С ней-то и будем баловаться.
  2. /wp-comments-post.php — обработка формы комментариев. Здесь мы будем вылавливать ботов.

Для начала сделаем небольшие приготовления. В самом начале файла /wp-comments-post.php сделаем запись параметров всех приходящих запросов в лог:

<?php
/**
 * Handles Comment ... тра-ля-ля
 */
 
$txt = date('d.m.Y, H:i:s')."\r\n";
$txt .= 'IP: '.$_SERVER['REMOTE_ADDR']."\r\n";
$txt .= 'UA: '.$_SERVER['HTTP_USER_AGENT']."\r\n";
$txt .= 'POST: '.print_r($_POST, 1)."\r\n";
$txt .= 'GET: '.print_r($_GET, 1)."\r\n";
$txt .= 'COOKIE: '.print_r($_COOKIE, 1)."\r\n";
$txt .= 'HEADERS: '.print_r(getallheaders(), 1)."\r\n";
$txt .= 'SERVER: '.print_r($_SERVER, 1);
@file_put_contents(dirName(__FILE__).'/logs/'.date('Ymd_His').'.txt', $txt); 
unset($txt);

Создадим ещё в корне блога каталог logs и установим права на запись в него. Теперь информация о каждом комментарии будет падать в соответствующий файл, вроде такого:

31.05.2009, 02:26:54
IP: 92.113.110.217
UA: Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)
POST: Array
(
    [author] =>; credit-have.ru
    [email] => credit-have.ru@mail.ru
    [url] => http://credit-have.ru
    [comment] => Мечтаете  о  новом автомобиле, но не можете оплатить сразу всю сумму. Не проблема! Автокредит предоставляет
        возможность  любому купить автомобиль и осуществить свою заветную мечту. Выберете самый рациональный для Вас вариант
        автокредита, и уже завтра Вы сможете прокатиться в долгожданном авто. Сайт credit-have.ru поможет Вам разобраться во
        всех нюансах автокредитования, программах кредитования, определиться с выбором банка и купить авто за 30 минут.
        [url= http://credit-have.ru]Получение кредита[/url]
    [submit] => Отправить комментарий
    [comment_post_ID] => 22
)
...
...

Вот так дорогой спамер заполнил поля формы «автор», «e-mail», «сайт» и «текст комментария». comment_post_ID — скрытое поле указывающее статью к которой идёт комментарий.

Теперь займёмся борьбой с ними. Рассмотрим несколько типов спамеров и методы борьбы с ними.

Боты не разбирающие форму

Подобные боты самые примитивные, что не мешает им быть вполне эффективными. Стандартная форма вордпресса имеет стандартные имена полей — author, email, url, comment и т.д. Они просто шлют POST-запрос с этими именами переменных и сильно не парятся. Так как имена в стандартной форме меняет мало кто, этот подход вполне работает.

А мы изменим. Найдём поле комментария (в /wp-content/themes/<текущая тема>/comments.php):

<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p>

И изменим на:

<p><textarea name="xcomment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p>

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

if ((isset($_POST['comment'])) || (!isset($_POST['xcomment'])) {
	die('Кыш отсюда злобный спамер');
}
$_POST['comment'] = $_POST['xcomment'];

Подождём некоторое время, пока не наполнятся наши логи и посмотрим на результат. В части логов по прежнему красуется [comment] => увеличьте член до 70 см. И что радует ни в комментариях, ни в письмах с просьбами о модерации ничего подобного нет.

Ура! Часть засранцев мы победили, займёмся остальными.

Боты разбирающие форму

Кроме вышеописанных, есть боты более ушлые. Они первым делом запрашивают страницу со статьёй, анализируют форму комментария, выцепляют из неё нужные поля и формируют запрос в соответствии с их именами.

Анализирующие боты так же различаются по степени интеллекта и бороться с ними нужно по разному.

Некоторые ищут поля по шаблонам имён и просекают что comment заменён на xcomment, а email на mail. А вот если заменить email на i8fmi54m для многих это станет непреодолимым припятствием.

В полях формы так же присутствует атрибут ID. Он так же может быть использован для определения поля, если не помог name. Можно заменить и его, проверив предварительно не повешены ли на него какие-либо стили или поведение.

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

Во всяком случае, используя анализ формы можно достаточно легко обойти изменения имён. Нужно вытащить все теги <INPUT> и <TEXTAREA>, их имена и значения по умолчанию. TEXTAREA это скорее всего и есть поле комментария, то которое нужно завалить ссылками на порево. Остальные INPUT’ы, которые уже имеют установленное значение нужно оставить как есть (скорее всего это скрытые поля). Те которые не имеют — засыпать каким-то барахлом. Например, вписать везде e-mail.

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

Значения по умолчанию

Как уже говорилось, многие боты оставят уже заданное значение INPUT’а как есть.

Сделаем простейшую вещь: зададим для адреса электронной почты value="quot;обязательно заполните это поле". Через стили сделаем его сереньким и добавим JS, чтобы при попадании курсора в него, надпись удалялась и пользователь мог ввести своё мыло. Тем кто не ввёл нормальный адрес, вежливо отказываем: «извините, но вы должны ввести свой e-mail».

Очень много ботов пошлют в запросе именно обязательно заполните это поле.

Значения по умолчанию-2

Добавим в форму поле <input type="text" name="xxx" value="" class="ixxx" />. И через CSS-класс ixxx сделаем его скрытым.

Пользователь в браузере просто не увидит его, но ни один из ботов не будет анализировать CSS-файлы на предмет, какие поля видны. Они просто обнаружат пустое поле и заполнят его. А мы в comments.php сделаем просто:

if ((!isset($_POST['xxx']) || ($_POST['xxx'] != '')) {
	die('Вот вы и спалились');
}

В добавок, продолжая тему смены имён и поиска полей ботами по порядку: поставим скрытое поле сразу перед e-mail, дадим ему name="email", а email-полю, что-нибудь вроде name="94m4f4". Кто из ботов разберёт какой здесь e-mail настоящий?

Заголовки и куки

Есть ещё много вариантов, как отсеить запросы от ботов.

Например, на странице статьи поставить пользователю какую-нибудь куку и проверять при обработке запроса. Далеко не все, даже анализирующие форму роботы, обрабатывают куки. Хотя многие обрабатывают.

Можно попробовать анализировать заголовки запроса и ещё много чего. Кому интересно может заняться этим сам.

Поиск статей на сайте

Первоначальная задача спамера, прежде чем проспамить статью — найти её. Чтобы по крайней мере указать её номер в [comment_post_ID].

Вариант: запросить главную страницу, вытащить из неё все ссылки и определить из них номера статей. Здесь им может сильно помочь стандартный способ адресации статей в wordpress: www.mysuperblog.com/?p=12 — статья с ID=12.

Включение ЧПУ в блоге значительно осложняет эту задачу. Поэтому некоторые просто шлют запросы просто на comment_post_id=1. Но, это не здорово, так как такой статьи может не быть, да и спам одной статьи к тому же, возможно, давно ушедшей с главной страницы, не даёт нужного спамерам эффекта.

Однако, даже при включении ЧПУ в wordpress, параллельно сохраняется старая нумерация. Например, данная статья так же доступна по адресу https://blgo.ru/blog/?p=155. Это упрощает жизнь плохим парням. Нужно просто перебирать урлы ?p=1, ?p=2, ?p=3…

Ситуацию могло бы изменить отключение старой адресации. Однако, насколько это просто и легко я не разбирался и не знаю.

PS.

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

PSPS.

Ждём комментариев от знатоков спама, почему моё исследование и выводы ацтой.

PSPSPS.

Я защитился от спама. Хочешь узнать как? Пришли СМС «Хачу!» на короткий номер.

27 комментариев »

  • Ура! Дождались!!!
    Первый!
    щас буду читать…

    epsyl, 5.06.2009, 18:46

  • Прочитал.
    В принципе, ничего нового не узнал.
    А на счет всех этих методик и их эффективности сказать ничего не могу, ибо не являюсь ни спамером, ни ярым борцом и исследования как автор не проводил, ибо акисмет и премодерация у меня работают на 99%.
    Придется ждать дуда!

    epsyl, 5.06.2009, 18:53

  • Если есть кто с Краснодара — пошлите седня бухать в барчик какой-нибудь, а то меня все кинули (

    epsyl, 5.06.2009, 18:54

  • >В принципе, ничего нового не узнал.
    Оно для начинающих

    >ибо акисмет и премодерация у меня работают на 99%.
    Премодерация меня задалбывает, акисмет тормозит

    >Если есть кто с Краснодара — пошлите седня бухать в барчик какой-нибудь, а то меня все кинули
    Здесь из Питера в основном, подваливай.

    vasa_c, 5.06.2009, 20:02

  • >Здесь из Питера в основном, подваливай.
    +1

    Сейчас почитаемс :)

    adw0rd, 6.06.2009, 1:24

  • > ибо акисмет и премодерация у меня работают на 99%.
    у меня акисмет в спам — не спам сует вовсе… вообще не доволен его работой…

    adw0rd, 6.06.2009, 1:32

  • только что прочел спам каммент:
    >как бороться со спамом? достали ведь уже…
    ))

    adw0rd, 6.06.2009, 1:35

  • На основе своего опыта (20-50 спам-сообщений/в день) могу сказать что «Значения по умолчанию» действует на 90%

    adw0rd, 6.06.2009, 1:44

  • >PSPSPS.
    Ну и где ответ почему?)) Я так этого ждал…

    adw0rd, 6.06.2009, 1:47

  • >Значения по умолчанию-2
    ушел пробовать по этому методу, мне он кажется наиболее оптимальным сейчас

    adw0rd, 6.06.2009, 1:48

  • Сегодня ночью спамеры жёстко отсосали! adw0rd уделал их всех по количеству сообщений.
    >Ну и где ответ почему?)) Я так этого ждал…
    Ладно, разберёмся.

    vasa_c, 6.06.2009, 10:49

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

    epsyl, 7.06.2009, 20:46

  • У меня так же. И меня камментят ещё меньше. Но так как я надеюсь на то, что камментить будут больше, то приходится просматривать все спам-комментарии в надежде, что там затесался кто-то нормальный.

    vasa_c, 7.06.2009, 20:52

  • Меня комментят достаточно хорошо, камментов 800 сейчас. Из них трекбеков штук 100-150 и спама — 30-50 максимум…

    adw0rd, 7.06.2009, 22:06

  • В день?

    vasa_c, 8.06.2009, 8:56

  • Всего :)

    adw0rd, 8.06.2009, 8:57

  • а что такое трекбек? )))

    epsyl, 8.06.2009, 12:59

  • http://ru.wikipedia.org/wiki/Trackback

    adw0rd, 8.06.2009, 13:57

  • спасибо, воспользуюсь, если понадобятся комментарии

    cobr123, 11.08.2009, 11:09

  • […] Действующая на сегодняшний день система – обманка бота, когда бот видит поле для заполнения, а живой человек нет. Значит, если поле заполнено, то – Привет, бот! Почитать, как это работает можно здесь и здесь. […]

    Борьба со спамом | WordPress для чайников, 9.09.2009, 17:17

  • Очень интересная познавательная статья! Спасибо большое!

    haZe, 9.10.2009, 23:36

  • Помчался делать у себя… не терпится запустить свои шаловливые ручки в код :)))
    10х!

    cellworld, 18.11.2009, 1:56

  • Классно, но для меня труднопонятно. Спамят сволочи одну страницу. Ковырялся и вобще запарол комменты, и смех и слёзы. Но я справлюсь . . .

    Алекс, 15.08.2010, 16:54

  • Интересно, насколько этот метод применим с позиции прошедших лет? Т.е. то, что код WordPress сильно изменился это понятно, но что если применять схожие методы на новых блогах — насколько поумнели боты?

    inst, 26.01.2012, 23:18

  • Отличная статья, спасибо!

    По стечению обстоятельств как раз занялся этой темой — надоело удалять спам руками.

    Как я понимаю, нечто подобное сейчас делает плагин Antispam Bee — то есть «развлекается» с полями в форме.

    Сам тоже думал о чём-то таком. Мне, правда, пришло в голову как-то переименовать кнопку отправки. Я не силён в Интернет-программировании, но, кажется, что submit он и есть submit.

    Посмотрел Вашу форму — всё сделали как описываете!

    Только что пришло в голову: можно не просто переименовать поля, а поменять их местами. То есть, полю для ввода автора дать имя поля для е-мейла, ну и так далее.

    На Вас вышел, обнаружив у себя в wp-comments-post.php кусок кода, который пишет лог при добавлении комментария. До сих пор чешу репу, откуда взялся =)))

    В ответ последнему оратору: скорее всего применим, в основах ничего не поменялось: формы те же, поля те же. При том, что такие методы вряд ли массовое явление, скорее всего боты «бьют по площадям», поэтому не сильно блещут интеллектом.

    Как у нас нет задачи отсеять 100% спама, т.к. каждый следующий процент даётся всё большими и большими усилиями, так и они не будут размениваться на то, чтобы их спам был в 100% блогов.

    Алексей, 16.04.2013, 20:03

  • if ((!isset($_POST[‘xxx’]) || ($_POST[‘xxx’] != »)) {
    die(‘Вот вы и спалились’);
    }

    Этот код не рабочий:
    1. лишняя скобка перед !isset.
    2. условия не верны в принципе (если пост-xxx НЕ установлен ИЛИ если пост-xxx НЕ равен пустой строке), т.е. будет срабатывать на всех

    Верный ответ:
    if ( isset($_POST[‘xxx’]) && $_POST[‘xxx’] !== » ) {
    die(‘Вот вы и спалились’);
    }

    Helper, 20.09.2015, 9:39

  • Helper,

    1. Наоборт не хватает скобки после isset :)

    2. Условия верны.

    Если не пришло xxx — значит бот просто данные отправляет не парся форму.
    Если пришло не пустое — значит распарсил форму и заполнил.

    vasa_c, 23.10.2015, 10:32

Leave a comment