Как закрыть путь для спама Вашего блога на WordPress.
Спам моих сайтов на WordPress стал для меня непосильным. На некоторых сайтах доходило до 2 тысяч спам-сообщений в сутки. Такое количество спама по воздействию уже равно xSS или DDOS атаке на сайт. Потому, что сайт уже просто виснет и перестает грузиться.
В поисках действенного способа борьбы со спаммерами были испробованы несколько плагинов к WordPress. В итоге был найден простой способ, дающий наилучший результат и в то же время самый легкий для работы движка и баз MySQL (так как в этом случае MySQL совершенно никак не задействована).
Суть данного способа в том, что спамерские скрипты настраиваются по умолчаниям движков атакуемых сайтов. Т.е. в нашем случае по умолчаниям Вордпресса. А по этим умолчаниям комментатор должен заполнить поля "Имя" (имеющее name="author" и id="author"), E-mail (имеющее name="email" и id="email"), и текстареа самого сообщения.
То есть спамерский скрипт настроен на поиск на странице данных полей по name или id. Вот и подстроим ему ловушку в виде поля, которое он ищет на странице, но из этой ловушки данные не будут передаваться никуда. А для нормального комментатора (чтоб его не путать выбором) уберем эту ловушку со страниц сайта в скрытый div за пределы видимой области экрана.
В итоге E-mail адрес комментатор-человек будет вписывать в поле на странице (только это поле будет иметь другой name и id) и его коммент будет добавляться. А робот-спамер же будет вписывать свое мыло в скрытом от человеческого глаза диве (так как он его искал) и в результате пролетать, как фанера над Парижем.
Дополнительный совет тем, кто будет использовать данный способ (если Вы достаточно подкованы для этого :) ): лучше изменить на свои названия из кода, приведенного ниже, для заново присваиваемых имени и id поля E-mail и дива, т.е. заменить в данном коде слова "adres-em" и "hunter".
Итак, сам способ:
В файлах comments.php и comments-popup.php шаблона темы находим примерно такие строку:
<input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
заменяем на:
<div class="hunter"><input type="text" name="email" id="email" value="" size="22" maxlength="1" tabindex="2" /></div> <input type="text" name="adres-em" id="adres-em" value="<?php echo $comment_author_email; ?/>" size="22" tabindex="2" />
В файле style.css шаблона темы для вывода поля-ловушки в 1000px слева от экрана компьютера добавляем в конце:
.hunter {position : absolute; left : -1000px; }
Где в скрытом диве за пределами экрана (на 1000 пикселей левее видимой области экрана) создается аналогичное поле с именем и id которые предусмотрены в WordPress для E-mail комментаторов по умолчанию. Из этого поля не передается параметр $comment_author_email. Дополнительный параметр maxlength="1" определяет возможность вписать только 1 символ, что противоречит установкам WordPress при проверке адреса E-Mail. Т.к. WordPress проверяет наличие символа "@" в емэйле.
Далее переопределяем в скрипте WordPress name и id поля, из которого скрипт должен брать адрес E-mail комментатора таким образом:
В файле wp-comments-post.php, который лежит в корне сайта находим примерно такие строки:
$comment_author = trim($_POST['author']); $comment_author_email = trim($_POST['email']); $comment_author_url = trim($_POST['url']); $comment_content = trim($_POST['comment']);
Заменяем их на:
$spam_test_field = trim($_POST['email']); if(!empty($spam_test_field)) wp_die('NO SPAM!'); $comment_author = trim($_POST['author']); $comment_author_email = trim($_POST['adres-em']); $comment_author_url = trim($_POST['url']); $comment_content = trim($_POST['comment']);
Хех, а не проще ли просто скрыть поле, если уж всё равно бот будет его заполнять?
Поле для бота и так скрыто, оно за пределами экрана. Человек его не видит. Но ведь оно должно присутствовать в исходном коде страницы, бот его должен находить, чтоб заполнить. Скрыть можно по разному, это один из вариантов. Или я вопрос не понял?
Я чего то не понимаю. А зачем то второе поле? Неужели не проще просто переименовать поля в файле и в цсс соответственно и все. Пускай бот ищет поле и не находит ))
Так пусть бот находит поле, считает, что запостил и передает хозяину ОК. :)
Потом, наличие этого поля-ловушки дает возможность наладить скрипту с нашей стороны проверять это поле на непустоту и, соответственно, применить какие-либо репрессии к спамеру… Но это уже другая задачка…
Как-то встретил этот прием защиты от спама на забугорном сайте - понравилось. Но разбираться влом было. А Вы разложили по полочкам. Спасибо.
Элегантное решение. К сожалению, на половине сайтов не удалось заставить работать. Там, где в “wp-comments-post.php” используется
trim(strip_tags($_POST[’author’]))
Не подскажете решения этой проблемы?
Спасибо.
А при чем trim(strip_tags($_POST[’author’]))?
Подробней напиши в чем проблема.
У меня этот вариант работает без проблем на сайтах с WP версий 2.0.9 - 2.3.3 (Выше версии не юзаю по причинам жалоб некоторых хостеров на большую загрузку серверов и с версии 2.5 WP, к сожалению, слишком много цинкует на wоrdprеss.оrg)
Все гениальное просто, благодарю.
Установил, но только применительно к полю comment.
А почему бы полю email не установить css атрибут display:hidden? Как по мне это более элегантный способ его спрятать. Или есть возможность для спамеров отловить такую установку?
Вы сами же и ответили на вопрос. Точно не знаю, но предполагаю, что именно так. Слишком стандартное решение…
Да, и еще… Кажется с полем comment — все же намного лучше делать.
Дело в том что только что, перед тем как запостить комент, табом прошелся по полям и наверное в спрятанное поле что-то написал и в результате я получил страничку генерируемую wp_die с неприличным выражением…
В приведенном выше коде неприличное выражение, употребленное мной на этом сайте, заменено на “NO SPAM!”
Ошибся немного, нужно было написать так:
“А почему бы полю email не установить css атрибут display:none?
По причинам, аналогичным приведенным в ответе Вам выше.
Классный способ защиты! Спасибо, буду использовать на своих сайтах!
Да вроде как от автомата прекрасно спасают плагины. Не знаю зачем вы что придумываете =)
Вот ручные комменты со ссылками в точках и смайлах это беда…
PS Способ хороший, но запоздалый
1. >способ, дающий наилучший результат и в то же время самый легкий для работы движка и баз MySQL
2. базы данных не засоряются, т.к. через плагины спам-комменты вносятся в базу.
3. каждуй плагин это дополнительная нагрузка на сервер + дополнительная уязвимость.
Думаю этих причин достаточно…
Ну если только в нагрузке дело.. тогда согласен…
Круто, поставил почти на все сайты, не одного спама не приходило
Только зачем на вашем сайте двойное поле name=”e-m-a-i-l” ?
35-ая - 38-ая строки:
Меняем на этот код —-
$comment_author = trim(strip_tags($_POST[’author’]));
$comment_author_email = trim($_POST[’email’]);
$comment_author_url = “”;
$comment_content = trim(strip_tags($_POST[’comment’]));
И 1. нам никто не оставляет никаких ссылок в коментах :)
Проще тогда удалить поле ввода урла комментатора из шаблонов comments.php и comments-popup.php темы. Но это не спасает от ссылок в тексте комментария.
А чем плох старый метод - забить базу бота ложными e-mail.
perl-скрипт для этого есть.
Ссылки из Вашего коммента удалил, т.к. предлагаемый скрипт не имеет никакого отношения к WordPress даже в перспективе, т.к. скрипт на Perl, а не PHP.
Идея хорошая…я еще чуть веселее сделал.
Перемешал поля Имя и Е-mail.
Т.е. робот сейчас постит эти поля в обратной очереди ;-)
и соответственно мейл не проходит проверку на валидность
У меня после установки этого кода стало невозможно размещать комменты в IE. Пишет “comment can not be empty” всегда…
Вероятно, у Вас где-то вкралась ошибка при установке кода. Попробуйте вернуть на дефолтную версию кода, проверить работу с ней, а потом ставить заново. Проведенный в статье код работоспособный на 100% - проверено неоднократно.
Огромное спасибо, блин достали спамеры уже. Каждый день по 30-50 тупых сообщений приходится вычищать.
Буду разбираться с кодом.
У Вас ошибка в коде, в ПХП функции стоит слэш (?/>)
И точно…
Поправил. Спасибо!
Что то у меня нифига не получается.
Дорвей у меня засыпает сайт по 3 раза в день, поставил wp-ban, не смог разобратся как он работает. Есть что то типа картинки, название которой надо ввести в ответ для того что бы определится что не бот ?
При этом способе ничего не будет на странице видно, никаких капч, картинок и ответов на вопросы. Просто люди будут заполнять нужные для добавления коммента поля, а боты поля, которых на экране нет.
А если я через мобилу лазию… она у меня css не поддерживает… фигней страдаете… написали бы лучше php скрипт для борьбы со спамом или фантазии ноль!?
Тут же речь о WordPress…
А на сайт на вордпрессе через мобилу зайти нельзя что ли? смех…
Конечно можно.
>Тут же речь о WordPress - я имел в виду, что речь о защите сайта на WordPress от заспамливания роботами-спамерами (типа X-Rumer), а не о просмотре посетителями…
>фигней страдаете… смахивает на грубость.
>написали бы лучше php скрипт для борьбы со спамом - неконкретное предложение.
в том то и дело что вы грубите пользователем у которых не работает css… и прятать div при помщи css это грубо и js всякие, без которых нормально на сайте не поработаешь… уводите свои инструменты в серверные скрипты, а не нагружайте клиетскую часть…
хоть прятаете вы форму или нет - все равно форма, “заполненная” спамером отправляется на сервер… так почему же на сервере со спамом не побороться???
Romaldo, давайте по порядку:
; с третьей стороны создание этого поля в скрытом диве и не очень обязательно, т.к. вполне будет работать и простая замена имен полей, о чем и писалось в комментах к статье.
>в том то и дело что вы грубите пользователем у которых не работает css… и прятать div при помщи css это грубо и js всякие, без которых нормально на сайте не поработаешь…
Ответ: с одной стороны, на пользователей, у которых не работает css я не расчытываю, т.к. тогда придет другой пользователь с разрешением экрана на своей мобиле 240px и скажет, что сайт, сделанный под разрешение не менее 800px является грубостью - вывод: необоснованно, каждый сайтовладелец вправе делать свой сайт так, как хочет и для тех посетителей, на которых расчитывает; с другой стороны в принципе можно подписать поле внутри скрытого дива: “Для спам-роботов…”
>уводите свои инструменты в серверные скрипты, а не нагружайте клиетскую часть…
хоть прятаете вы форму или нет - все равно форма, “заполненная” спамером отправляется на сервер… так почему же на сервере со спамом не побороться???
Ответ: Так при данном способе и происходит обработка на сервере. Притом только на сервере, который пытаются заспамить. А плагины типа Akismet еще создают и выполняют запрос в свою центральную базу, проверяя, не от спамера ли добавляемый коммент… Т.е. уже минимум два сервера в работе при добавлении каждого комментария получается. Коммент признанный Акисметом “спамерским” все равно добавляется в базу данных сайта, только с пометкой “спам” - значит еще и нагрузка на MySQL добавляется + база засоряется + Акисмет нередко ошибается, и нормальные комменты относит к спаму.
Надеюсь я ответил на Ваши вопросы.
придет другой пользователь с разрешением экрана на своей мобиле 240px и скажет, что сайт, сделанный под разрешение не менее 800px является грубостью
ответ : он этого не заметит, так как у него отключен css, и если у вебмастера валидный html - то проблем с отображением не возникнет, и как раз скрытые объекты через css будут всплывать и раздражать… я все сказал