WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

Блокируем Спам в комментариях

Этот пост уже не актуален! Теперь от спама я избавляюсь используя свой плагин, подробнее тут: Плагин для блокировки спама в комментариях (для WordPress).

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

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

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

Рождение идеи

Идея нижеописанного способа родилась буквально по ходу написания предыдущей статьи, - "Как запустить обработку формы используя JavaScript".

В предыдущей статье я описал, как можно засабмитить форму используя ссылку вместо стандартной кнопки button. В период написания статьи я подумал, а что если удалить кнопку подтверждения комментария, что будет в результате? Спам проги, все равно будут, сабмитить форму, потому что им для этого кнопка вообще не нужна, они просто сабмитят форму и все тут (это я кстати проверил, так и есть - кнопка не нужна, спам приходит даже, если вообще убрать кнопку submit). Следующим шагом моей мысли стал, - "а что, если жестко привязать возможность комментировать к кнопке подтверждения комментария, тогда стандартный способ сабмита формы комментирования не будет работать вовсе, что и требовалось доказать"! Т.е. нужно сделать, так, чтобы для отправки комментария обязательно нужно было использовать кнопку комментирования и никак иначе, в противном случае комментарий не отправляется туда куда нужно. Реализовать это получилось очень просто.

Итак, к делу.

Избавляемся от спама в комментариях в WordPress

Чтобы избавится от спама нужно открыть файл темы comments.php и найти там форму комментирования. Начало кода примерно такое:

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

Затем, нужно сделать три легких тело-движения:

#1 Изменить ссылку на файл обработчик, куда форма отправляет данные:

// В подобной строке
<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

// нужно изменить значение атрибута action. Например, так:
<form action="/logo.gif" method="post" id="commentform">
// Здесь я поставил ссылку на картинку logo.gif (писать можно что угодно, главной убрать стандартную ссылку /wp-comments-post.php).

#2 Затем, перед этой строчкой (которую только что отредактировали), нужно добавить следующий javascript:

<script type="text/javascript">
function cform(){
	document.getElementById("commentform").setAttribute("action", "/wp-comments-post.php");
	document.forms["commentform"].submit();
}
</script>

#3 И наконец, добавить к кнопке подтверждения формы такой код: onclick='cform()':

// выглядит примерно так:
// было
<input type="submit" id="submit" value='Комментировать' tabindex="5" />
// стало
<input type="submit" id="submit" value='Комментировать' tabindex="5" onclick='cform()' />

Вот и все, осталось только залить файл comments.php на сервер и забыть про автоспам в комментариях smile

Минус у этого способа: при отключенном JavaScript невозможно будет оставить комментарий. Но это не страшно, ведь сегодня JavaScript неотъемлемая часть любого сайта.

Дополнительная информация

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

<a href="javascript: cform()" id="submit" tabindex="5">Комментировать</a>

Теперь, даже если спам-прога умеет имитировать нажатие на кнопку, она просто эту кнопку не найдет, потому что её нет. А пройти по ссылке, чтобы подтвердить комментарий, такого я вообще нигде не встречал, поэтом спам-проги на это точно не рассчитаны.

Почему я сразу не предложил поставить ссылку вместо кнопки? Потому что, для того, чтобы она вписывалась в дизайн и выглядела как кнопка, её нужно будет оформить через css, а это могут далеко не все.

Обратите внимание

Некоторые спам-проги постят комментарий прямо в файл wp-comments-post.php, т.е. отправляют комментарий не со страницы сайта.

Если комментарий отправляется таким образом, то вышеуказанный метод не отфильтрует спам. Чтобы разрешить комментарий только со страницы сайта добавьте нижеследующий код в ваш файл functions.php.

/* Хук, который блокирует комментарий, если он был отправлен не с комментируемой страницы
-------------------------------------------------------------------------------------------- */
function kama_check_comment($comment_post_ID) {
	$ref = trim(preg_replace('!/comment-page.*|https?://(.*?)/|#.*|\?.*!i','',$_SERVER['HTTP_REFERER']),'/');
	$permalink = trim(preg_replace('!/comment-page.*|https?://(.*?)/|#.*|\?.*!i','',get_permalink($comment_post_ID)),'/');
	if ($permalink != $ref)
		wp_die("REFERER: $ref<br />LINK: $permalink<br /> You have no permission to post a comment!");
	else
		return $comment_post_ID;
}
add_action('pre_comment_on_post', 'kama_check_comment',0);

Раскрутка сайта www.seop.ru

раскрутка сайта www.seop.ru

www.seop.ru

Блокируем Спам в комментариях 24 комментария
  • Николай cайт: somemoreinfo.ru

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

    Ответить2.4 года назад #
  • Александр

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

    Кстати, при вводе комментария не работает выделение слов мышой и шифт+стрелки (ubuntu 16.04 + firefox).

    За сайт - большое человеческое спасибо!

    Хм... с первого раза не отправился коммент, 502

    • Kama4472

      Кстати, при вводе комментария не работает выделение слов мышой и шифт+стрелки (ubuntu 16.04 + firefox).

      У меня в хроме на винде все работает... Без понятия что это может быть...

      Хм... с первого раза не отправился коммент, 502

      Сервер видимо глюкнул или я может что-то делал с сайтом - бывает wacko . Хорошо что коммент не потерялся...

Здравствуйте, !

Ваш комментарий