Как закрыть путь для спама Вашего блога на 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 будут всплывать и раздражать… я все сказал
Рано я обрадовалась :)
Проделала всё - форма для каментов исчезла совсем. Методом тыка обнаружила, что она возвращается на место, если поставить назад умолчательный код для comments.php…
Нужная строчка у меня в этом файле выглядит так:
то есть не совсем так, как в Вашем примере. Я заменяла её всю на предложенный Вами код - тогда исчезает форма для комментариев (как и сами комментарии).
Сама экспериментировать боюсь, лох патамушта… :(
Не могли бы Вы, дорогой наш, помочь советом, а? Мне кажется, всё дело в кусочке:
но как связать Ваш код и этот кусочек - нинаю.. хелп?
Вам совершенно верно кажется. В кусочке
<?php if ($req) echo "aria-required=’true’"; ?> />имеется if - то есть начало условия, соответственно у условия должен быть конец. Если начало или окончание такой конструкции удалить, то будет ошибка в файле, поэтому все пропадает.Приведенную Вами строку кода:
<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" <?php if ($req) echo "aria-required=’true’"; ?> />оставьте без изменений.
Советую Вам сделать упрощенно, но не менее эффективно:
Просто измените имена полей формы по умолчанию таким образом:
в файле wp-comments-post.php, который лежит в корне сайта замените только одну строку:
$comment_author_email = trim($_POST['email']);дословно в переводе на русский данная строка означает: в переменную $comment_author_email берем то, что передано методом POST из поля email, обрезая пустоты по краям (trim).
На строку:
$comment_author_email = trim($_POST['adres-em']);А файлах comments.php и comments-popup.php шаблона темы найдите примерно такую строку (главное чтобы в ней было вхождение name=”email”:
<input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />и в ней замените только имя у поля формы, то есть name=”email” замените на name=”adres-em” не трогая остальной код в файле.
То есть в результате этих действий Вы измените стандартное имя у только одного поля формы на свое, уникальное. Обычно этого достаточно. После тестирования, убедившись что все работает, освоившись и поняв в чем был смысл действий, можно аналогично заменить стандартные имена и у других полей.
Не поняла… отправила камент, а его нету. Сообщения о модерировании - тоже. В прошлый раз, кстати, было то же самое…
И, что обидно, не нашла у Вас никакой контактной формы, дабы маякнуть - мол, отослан комментарий, не потерялся бы и тыды… :(
Продублирую, а? (не бейте тока, плз!)
__________________________
Одмин, проделала :)
Но мутным старым своим мосхом не могу понять, как это работает (интересно же!)… (и мне, значит, даже не требуется лезть в стили и сдвигать строчку куда-то там? просто поменять имя?)
Тоись бот заполняет поля, а ему в ответ что происходит? А человек когда заполняет - почему не происходит то, что происходит с ботом?
Стесняюсь спросить… извините… а вот эта закрывалка/открывалка камента(-ов) - чем у Вас организована? Имхо, отличная штука…
Подписалась на Вас - тут, оказывается, чёртова куча полезняшек! Спасибо :)
-даже не требуется лезть в стили и сдвигать строчку куда-то там? просто поменять имя?
Да.
-Тоись бот заполняет поля, а ему в ответ что происходит? А человек когда заполняет - почему не происходит то, что происходит с ботом?
Бот ищет поле по исходному коду страницы, в исходном коде - по имени поля (name=”имя_поля”). В этом случае бот просто не находит нужного поля, не вводит мыло и получает собщение об ошибке. Человек поле естественно находит, так как ищет визуально и ему фиолетово, какое имя у данного поля прописано, и, соответственно, у него все ОК.
-эта закрывалка/открывалка камента(-ов) - чем у Вас организована?
закрывалка/открывалка камента(-ов) - это что имеется в виду? Уточните - отпишу. А вообще, тут очень старая версия WP стоит. Комменты работают с использованием Brian’s Threaded Comments plugin, правда с большим количеством моих правок в коде плагина и руссификацией.
-не нашла у Вас никакой контактной формы, дабы маякнуть - мол, отослан комментарий, не потерялся бы и тыды… :(
Да, это мне, пожалуй, стоит исправить… Сделал простенькое уведомление о том, что комент добавлен в базу, не пропал даром.
Ваши два коммента пересортировал в один.
Этот блог очень редко обновляю, сейчас занимаюсь своим движком - Almaz CMS.
Послушайте, это, чёрт побери, потрясающий способ избавиться от спама!!! Я ж каждый день лезла проверять, чего туда позакидывал Akismet, трясясь от бессильной прям ярости ко всем этим “а у вас шапка в опере сдвинута” или “как-то всё сухо” - ннненавижу!
А сегодня у меня праздник, ей-богу - НИ ОДНОГО спам-камента!!!!!!!!
Спасибо!! Обязательно напишу о Вас, когда буду живописать мои мучения по настройке ВП :)
Открывалки/закрывалки - имелись в виду плюсы/минусы в левом верхнем углу комментария, по щелчке на котором камент закрывается/открывается.
Если у Вас старая версия ВП плюс к этому правки в коде, тада я пролетаю. Ну, ладно :)
Иду читать про Almaz CMS - страшно интересно!
Сделал простой пример сворачиваемого-разворачиваемого контента в слоях, бессовестно выдрав из Brian’s Threaded Comments plugin те части, которые обеспечивают данный функционал. Надеюсь это Вам поможет.
Смотреть пример и скачать архив с ним тут.
Насчёт сворачивания и Вашего примера… я почитала… и ничего не поняла… не думаю.. нет, я даже уверена, что не осилю сию премудрость… :( Огромное спасибо за великодушие и героическую готовность помочь, но для меня всё, что написано в примере - тёмный-тёмный лес… :((
Я сейчас сойду с ума… ненавижу ВП!!!! У меня теперь вообще ни один комментарий невозможно отправить: “Ошибка: пожалуйста, заполните необходимые поля (имя, e-mail)” и всё, тупик. Жопа! Жопа!! Жопа!!! Ненавижу коды!!! Я ничего не понимаю!!! (рыдайет)…
Короче, если вернуть стандарное значение email, то комментарии приходят. Если вместо него поставить другое значение, комментарии не пробиваются не только от ботов, но и от людей. Вот так, значить… я шоке оО
Allpa, скачал новую версию WP 2.8.4, установил и еще раз проверил. Все работает. Учтите, WordPress в кодировке UTF-8, и если копировать текст со страницы сайта, то в тексте нужно поменять кавычки на обычные! Для Вас пошаговая схема действий:
Если устраивает условие, что комменты будут добавляться только со страниц твоего сайта, ни откуда больше, то делаем следующее:
Пошагово:
Откываем файл wp-comments-post.php в корневой папке WP в текстовом редакторе (рекомендую Notepad++),
ищем строку 38 файла wp-comments-post.php:
$comment_author_email = ( isset($_POST['email']) ) ? trim($_POST['email']) : null;меняем на:
$comment_author_email = ( isset($_POST['eadress']) ) ? trim($_POST['eadress']) : null;Далее открываем файл comments.php ИСПОЛЬЗУЕМОЙ на сайте темы.
В дальнейшем тексте приведено для дефолтной темы - произведены замены для имени поля, в используемой теме надо сделать аналогично.
Ищем строки аналогичные следующим строкам в comments.php дефолтной темы (там это строки 74 и 75):
в исходном варианте было:
<p><input type=”text” name=”email” id=”email” value=”<?php echo esc_attr($comment_author_email); ?/>” size=”22″ tabindex=”2″ < ?php if ($req) echo “aria-required=’true’”; ?><br />
<label for=”email”><small>Mail (will not be published) < ?php if ($req) echo “(required)”; ?></small></label></p>
В дефолтной теме заменил на:
<p><input type=”text” name=”eadress” id=”email” value=”<?php echo esc_attr($comment_author_email); ?>” size=”22″ tabindex=”2″ <?php if ($req) echo “aria-required=’true’”; ?> />
<label for=”eadress”><small>Mail (will not be published) <?php if ($req) echo “(required)”; ?></small></label></p>
Точно так же, открываем файл comments-popup.php ИСПОЛЬЗУЕМОЙ на сайте темы.
Ищем строки аналогичные следующим строкам в comments-popup.php дефолтной темы (там это тоже строки 74 и 75):
в исходном варианте было:
<input type="text" name="email" id="email" value="<?php echo esc_attr($comment_author_email); ?>" size="28" tabindex="2" /><label for=”email”>E-mail</label>
В дефолтной теме заменил на:
<input type="text" name="eadress" id="email" value="<?php echo esc_attr($comment_author_email); ?>" size="28" tabindex="2" /><label for=”eadress”>E-mail</label>
НЕ ЗАБЫТЬ ПЕРЕЗАЛИТЬ НА ХОСТИНГ ВСЕ ТРИ ФАЙЛА!!!
Проверяем просто: разлогиниться (выйти из аккаунта админа) и самому добавить любой коммент к любой статье. Потом снова логинишься и если коммент добавился нормально - то идешь и его модерируешь (удаляешь).
Сейчас проверю. Я, кажется, знаю, где допустила ошибку… щаз, сек…
Ура! Всё работает!
Вот моя промашка: в файле wp-comments-post.php я вставила другое значение только в одном месте, то ли здесь isset($_POST[’adress’], то ли здесь trim($_POST[’email’]) (не помню точно, но то, что в ОДНОМ, а не в двух, факт). Озарило меня только сейчас, когда читала Ваш ответ.
Мне ужасно стыдно.. просто УЖАСНО! Столько отняла Вашего времени по своей заполошенной невнимательности, о боги, боги… простите, пожалуйста…
Я всенепременно напишу о Вас, о Ваших блогах - народ должен знать благородных и бескорыстных своих рыщарей!
Спасибо! Спасибо!!! Я Вас обожаю, честно :)
Стоп… (подозрительно)… а что стоит за этим:
???
Это юзеры не смогут отправлять каменты с мобильника, например, а только с сайта?
(волнуясь)… это, наверное, не того… не этого… :/
Без разницы, с мобильника ли зашли к тебе на сайт люди или с обычного компьютера. Главное, что они пишут коммент тебе на сайт со страницы твоего сайта, а не из какого-нибудь Xrumera и т.п. коммент-клиентов. Данное условие мной написано, так как подозреваю, что возможно скоро какая-нибудь социальная сеть предложит своим юзерам комментировать статьи их сайтов из своего интерфейса - но это мои фантазии, глюки. Ведь это дыра для спама тогда будет…
Короче, не обращай внимания на эту оговорку.
Да, и не забыть сохранить измененный файл после автообновления. ;)
Сам пользуюсь подобным методом уже третий год, результатами доволен, но стоило только автообновиться - приветы от спамеров тут как тут. :(
comments-popup.php а где искать эту страничку, в какой паке???
прошу прощение, я нашла ту страницу, но она из другого шаблона.
comments-popup.php не во всех шаблонах присутствует. Но в некоторых встречается, хотя я, честно говоря, так и не понимаю, как он реально используется. Но коммент через него запостить точно можно. Поэтому если в папке шаблона такой файл есть, то в нем надо проделать указанные правки кода.