WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Купить персональные IPV4 и IPV6 прокси

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

Этот пост уже не актуален! Теперь от спама я избавляюсь используя свой плагин, подробнее тут: Плагин для блокировки спама в комментариях (для 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.

## Хук, который блокирует комментарий, если он был отправлен не с комментируемой страницы
add_action( 'pre_comment_on_post', 'kama_check_comment', 0 );
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;
}
23 коммента
  • Николай somemoreinfo.ru

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

    Ответить4.5 года назад #
  • Максим vverh.studio

    Читал и орал от гениальности первого способа, спасибо) Очень полезно

    Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться