8 июня 2009 г. PHP Wordpress Спам

Эффективная защита блога от спама в Wordpress

Лангольер

Мне ежедневно приходит порядка 10-30 комментариев, из них большинство - спам (90%), меня это очень сильно достало! Akismet не спасает, пропускает спам как решето, а иногда и нормальные комментарии помещает в спам! Вообще работает отвратительно!

Ставил и другие плагины для Wordpress, которые использовали общую базу спамеров или которые вписывали куки. У первого глючила база, у второго не ставились куки!

На днях, Григорьев Олег aka vasa_c затеял борьбу со спамерами и написал статью Антиспам своими руками. И только после этого, я решил тоже начать борьбу со спамерами, и всетаки нашел активную спам-защиту! Теперь в блог не проходят спам-сообщения, вообще не одного!

В чем же секрет? Приступим...

Теория

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

В теории это годится для любого сайта, а сейчас расскажу подробнее о практической части применимой к Wordpress!

Практика

Вносим правки в тему вордпресса

Правим форму в вашей wordpress-теме (файл comments.php):

  1. переименовываем "input с емайлом" из "email" в "WoRd1"

  2. создаем новый "input" и называем его "email"

  3. Переименовываем "textarea" с именем "comment" в "WorD2"

<form action="/wp-comments-post.php" method="post" id="commentform"> 

    <input    name="author" id="author" tabindex="1" /> 
    <input    name="email"  id="emailh" /> 
    <input    name="WoRd1"  id="email"  tabindex="2" /> 
    <input    name="url"    id="url"    tabindex="3" /> 
    <textarea name="WoRd2"  id="comment" cols="100%" rows="10" tabindex="4"></textarea>

    <input    name="submit" type="submit" tabindex="5" value="Отправить" /> 
    <input    name="comment_post_ID" type="hidden" value="775" /> 

</form>
Вместо "WoRd1" и "WoRd2" - по возможности вставьте свои имена!

Теперь надо скрыть созданный нами фейковый input "email", но не через type=hidden, ибо могут заметить боты, а через CSS-стиль (труднее ботам, вряд ли они будут париться).

#emailh { display: none; }

Вносим правки в обработчик комментариев

Далее, открываем файл wp-comments-post.php и добавляем в самом начале файла наши созданные и измененные поля на обработку.

<?php
/**
 * Handles Comment Post to WordPress and prevents duplicate comment posting.
 *
 * @package WordPress
 */

// Подменяем comment (textarea)
$_POST['comment'] = $_POST['WoRd2'];

// Подменяем email и если заполнено поле "email", помечаем "автора" как "author_name [SPAM]".
// Тут вы можете вызвать return; или exit; например!
$_POST['author'] = empty($_POST['email']) ? $_POST['author'] : $_POST['author'].' [SPAM]';
$_POST['email'] = $_POST['WoRd1'];

Вот и все, антиспам защита готова!

Я протестил это решение в течении 3-х дней, НЕ ОДНОГО СПАМ КОММЕНТАРИЯ!

upd: В течении 1 месяца и 7 дней по прежнему НЕ ОДНОГО СПАМ КОММЕНТАРИЯ!
upd: В течении 1-го года и 1-го дня по прежнему НЕ ОДНОГО СПАМ КОММЕНТАРИЯ!

Комментарии

Молодчина! :)

> НЕ ОДНОГО СПАМ КОММЕНТАРИЯ!

Ну это пока это решение у одного тебя.
Если начнут повсеместно использовать то, спамеры зашевелятся.

Добавление одного поля еще не очень критично, "всего" в 2 раза дольше спамить.
При добавлении штук 30 рандомных полей получаем 496 вариантов (33 поля всего (n-2)*(n-1)/2 для всякого n > 2).

496 POST запросов это уже жесть, придется разбирать CSS.

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

Впрочем, для скрытия полей начнут генерить CSS динамически с рандомными id ками...

Короче батл СпамерыVSВладельцы_Сайтов не имеет конца как обычно. ;)

P.S. Интересно спам боты анализируют сайты на которых были? Т.е.:
"Сайт http://adw0rd.ru защита Аксимет. Рентабельность спамления столько-то процентов."

ИМХО было бы очень удобно, так сделать:
Анализатор:
1. На новый сайт заходит анализатор, пробует несколько алгоритмов обхода защиты.

  1. Если комментарий добавился сразу, записываем связку хост/используемый алгоритм в БД. и всегда запускаем для спама этого сайта бота заточенного под конкретный алгоритм.

  2. Если алгоритмы обхода защиты не прошли, скорее всего либо предмодерация, либо неизвестный алгоритм защиты. Смотрим уже добавленные комменты, пробуем подобрать мыло, что бы обойти предмодерацию (очень часто ник pupkin соответствует pupkin@mail.ru).

  3. Если ничего не помогло:
    а. Ставим сайту рентабельность 0.(Чего зря ресурсы тратить без отдачи).

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

  1. Для взломанных сайтов тоже можно выставлять рентабельность(сколько ресурсов затраченных на сколько комментариев). Что бы при спам рассылке сначала простые мишени быстро все накрывать а потом уже со сложными возится (:

P.P.S. Чорт даже интересно стало как это все устроено, попробовать что ли спам бота своего с блекджеком и шлюхами написать? (:

При добавлении штук 30 рандомных полей
Бот не будет заполнять рандомные поля, он будет заполнять нужные (comment, author и т.д. - всего 4/5), остальное заполнит тем же рандомом :)

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

б. Добавляем хост в категорию «на просмотр» спамопрограммисту, он уже вручную будет просматривать и, если таки не хорошая защита, а просто предмодерация, искать решение проблемы.

Да нахер то им надо?) единицы из массы - не их конек, их конек - массовость

Да, ты в целом описал так же как я бы делал спам-бота... :)
Но делать я его не собираюсь, не интересно :/

Спамеры решили меня трекбеками завалить про мастурбаторы :)

С тебя статья "антимастурбаторы своими руками"

Бот рассказывает мою статью http://podcasts.ubot.ru/get_mp3.mp3?f=/17327/f-697982197.mp3

Особенно жжёт чтение кода :)

сильно похоже на украинский :)

vasa_c, :))))

интересно, надо будет попробовать.

У меня до сих пор не одного спам-комментария!
Только трекбеки шлют, в неделю 2 штучки пришли... :)

Плагин от dimigod c галочкой тоже отлично работает )

Жизненно, спасибо за интересную статью - все гениальное просто )))

Да, хорошая защита на сегодняшний день.
А трекбеки я вообще отключил, зачем они нужны то?

Да я тоже отключил, мне они не нужны

у тебя кстати ошибка

$_POST['author'] = empty($_POST['email']) ? $_POST['author'] : $_POST['author'].' [SPAM]';

если установлена переменная, то все норм, если email не установлена, то это спам =)

Professor, а в чем ошибка?

Тут формируется имя автора. Если НЕ ввели данные в поле e-mail, то автор чистый, а если ввели, то добавится надпись [SPAM].

У меня же поле e-mail не видимое, поэтому в него ничего не введут живчики.

В том то и дело.
посмотри на логику свою.

если
empty($_POST['email'])//переменная установлена
то
$_POST['author']=$_POST['author'] //все нормально

А как может быть нормально,если email не должен быть установлен?

Тоесть либо аргументы поменять нужно, либо знак ! поставить.

Или я туплю?

ты знаешь что делает empty?

empty - определяет, установлена ли переменная.

Я сначала мануал почитал.
Может не там читал =)

Я почему об этом написал, потому что у меня так работает

if(!empty($_POST['email']))
{
    return false;
}

а так не работает

if(empty($_POST['email']))
{
    return false;
}

Professor, isset проверяет, а empty проверяет значение переменной.

$_POST['author'] = empty($_POST['email']) ? $_POST['author'] : $_POST['author'].' [SPAM]';

"имя_автора" = "если значение у e-mail пустое", "то имя_автора", "если не пустое, то добавить к имени автора надпись [SPAM]".

adw0rd, покажешь как у тебя реализовано?
У мня не работает.
а точней:
если делать так

if(empty($_POST['email']))return false;

то я сам не могу коменты оставлять. Показывает пустую страницу

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

P.S. Чето как то странно empty работает =( не логично нифига.

то я сам не могу коменты оставлять. Показывает пустую страницу
а у тебя поле email есть? ты туда что-то вводишь?

Поля email нету.


<?php

$_POST['author'] = 'spammer';
$_POST['email'] = 'spammer@fuck.com';

$_POST['author'] = empty($_POST['email']) ? $_POST['author'] : $_POST['author'].' [SPAM]';

var_dump($_POST);

?>

Вот, тебе для теста, думаю теперь все поймешь.

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

Professor, у меня неодного еще юзера с именем "тут_имя [SPAM]" небыло, это доп проверка, а главная проверка состоит в:

$_POST['comment'] = $_POST['WoRd2'];

Поля email нету. только если я как администратор вхожу. Поэтому и не проходит наверно проверку.
Это долбаный empty =(

Professor, у меня неодного еще юзера с именем "тут_имя [SPAM]" небыло, это доп проверка, а главная проверка

А у меня был =)

Чето странно все это =) пойду дальше разбираться =)

Я не понимаю что ты мутишь и причем тут "вхожу как администратор"...

Поля email нету
с какого х? ты его убрал? зачем?

Я его не убирал! =)
Просто когда пользователь не авторизован, то поле email есть
а когда авторизован, то нет этого поля.

я хз как так получается.

кстати, сделай папддинг и марги поменьше у

кстати, сделай папддинг и марги поменьше у
у чего?

Я его не убирал! =) Просто когда пользователь не авторизован, то поле email есть а когда авторизован, то нет этого поля. я хз как так получается.

уф, устал... забудь про авторизованного пользователя, тебя только спамеры интересуют! Спамер не может быть авторизован!

Разберись с оператором empty, ты явно не понимаешь для чего он.

Можешь не юзать мой код, почитай теорию и напиши свой код, это же примитив из примитивов...

Можешь не юзать мой код, почитай теорию и напиши свой код, это же примитив из примитивов...

это да. Просто хотелось взять готовенькое =)

у чего?

у тега


<p>

а то сильно вытянутый текст получается

У меня этого тега более 100 штук, где конкретно?

это да. Просто хотелось взять готовенькое =)

Тогда:
1. разберись со своими полями, а точнее с названиями
2. разберись что такое empty
3. заменяй название полей на поддельные и создай скрытое фейквое поле email
4. проверяй в скрипте-обработчике камментов эти поля

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

Сенк за ссылку :)

Корочек попа в том что данные сохроняются в кеш, и подставляются как у спам бота ((((

Повторюсь

// Тут вы можете вызвать return; или exit; например!

а как бы это осуществить? кроме их прямого перевода "ни... чего, ни... понимаю" . не особо хочется в ручную удалять спам.

Корочек попа в том что данные сохроняются в кеш, и подставляются как у спам бота ((((
Это как?

Повторюсь
// Тут вы можете вызвать return; или exit; например!

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

Так вызывайте exit(); или return, что вам больше нравится, в чем проблема?

Шаблон выдать такой умный ))), иль я напортачил. если без авторизации, оставили комент то при написании следующего в поле для бота вносится емайл(по видимому кукисами).
exit (); или return ---- :(((( а я не знаю как их вызывать, но что в инете накопал так и не понял как оно работает и как туда подставить.
Хотя с небольшими косяками(моими) все работает, спасибо за код и внятную инструкцию

exit (); или return ---- :(((( а я не знаю как их вызывать

В том месте где написано

// Тут вы можете вызвать return; или exit; например!
вставьте
exit;
или
return;

Все отстал, еще руки корявые. вопросов не имею. Удачи!!

Думаю вам проще использовать плагин http://mywordpress.ru/plugins/dcaptcha-ya-ne-robot/

Спасибо за совет, но этот мне по душе 2 дня спама 0 как раз подчистил 9000 коментов )))

Владислав 3 октября 2009 г. 11:00

А что если просто взять и удалить в шаблоне темы, в файле comments.php строку позволяющую вписывать свой сайт?

Владислав, и что получится?

Владислав 3 октября 2009 г. 20:42

При написании комментария читатель просто не будет иметь возможности оставить адрес своего блога/сайта. Я считаю цель написания комментария состоит не в том чтобы оставить ссылку на свой сайт, а в выражении своих мыслей, в обсуждении написанного!

так большинство спамеров вшивают ссылки в тело сообщения, а не в урл "своего сайта"

Владислав 4 октября 2009 г. 10:35

Да, видимо тогда это не решение проблемы:( Но, считается ли спамом комментарии типа: Классно, Вы не подскажете где можно поменять двери и т.д?

Да, это считается спамом, но если это автоматический спам, то мой механизм его пошлет куда подальше. А если это ручной, то надо самому фильтровать.

Владислав 4 октября 2009 г. 21:21

Спасибо за разъяснения:) Нужно попробовать поставить.

И при обновлении придется все переделывать. Плагин "Я не робот" тоже эффективен. C такой переделкой правда заметно уменьшение запросов к сайту, видимо спамеры получают отлуп и больше не приходят :)

В течении 1-го года и 1-го дня по прежнему НЕ ОДНОГО СПАМ КОММЕНТАРИЯ!

Интересно, но обходимо.

Это все в теории, а на практике 100% избавления от автоматического спама

Привет не поленись добавь пожалуйста кнопку ретвита, а то хотел себе твитнуть да кнопки не нашел.

Ага, надо будет

Сделал кнопку, в конце статьи, рядом с тегами к статье... Нормальный текст статуса передаю или лучше "RT @adw0rd ..." ?

Спасибо тебе большое, я думаю многие блогеры теперь будут благодарны тебе за столь интересный способ избавления от спама.

Попробовал у себя, работает безотказно. Ну и небольшой очерк, как всё быстро сделать в кейке - http://sinkler.ru/posts/antispam_for_cakephp

ништяк, спс)

почему на пыхе такой шутки нету? )

Примерно через год возвращаюсь к вашему посту. У меня возник вопрос, а возможно ли сделать подобное для движка dle?
Если да то прошу помощи в этом вопросе.

Да возможно где хотите, но в dle я не силен :)

Понятно на днях попробую сам покопаться в движке dle может что и выйдет.

я новичок в php, подскажите, как можно сразу перемещать в папку spam если имя автора=$_POST['author'].'[SPAM]'
или чтобы форма не сабмитилась

Оставьте свой комментарий

Markdown