Есть у меня довольно популярный сайт на движке WordPress. И есть у него возможность для посетителей оставлять комментарии к материалам. Разумеется, пытаются воспользоваться этой возможностью и спамеры всех мастей и национальностей. Комментарии у меня все премодерируемые, поэтому шансов на то, что их творения увидят свет, у спамеров нет. Но зато у меня есть лишняя забота – удалять спам-комментарии. И решил я как-то облегчить мне жизнь и переложить защиту от спама на компьютеры.
Рассуждал я примерно так – что пытается сделать спамер? Разумеется, запихнуть адрес рекламируемого сайта в поле URL и вставить в текст комментария какую-либо контактную информацию (тот-же адрес сайта, мыло и т.п.). Причем в большинстве случаев делать он это будет не «ручками», а с помощью проги, которая прекрасно умеет работать с формой добавления комментариев такого популярного движка, как WordPress.
Работать я решил в двух направлениях. Во-первых, я решил использовать поле для добавления адреса сайта как своего образа автомат распознавания спам-ботов. Я решил оставить эту форму, но сделать ее невидимой. Таким образом, если комментарий будет делать человек, он не увидит поле для ввода URL и, соответственно, оставит его пустым. Если форму будет заполнять робот, то он в это поле вставит адрес сайта. Сделать поле невидимым можно так – в шаблоне в файле comments.php строки ввода адреса сайта обрамляем тегом <div style="display: none">. Получается примерно следующее:
<div style="display: none">
<input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>"
size="22" tabindex="3" />
<label for="url">Не вводите в этом поле ничего!</label>
</div>
Однако полностью это проблему не решает. Форму может заполнять какой-нибудь «умный» бот, а может и человек. Для этого случая установим второй уровень обороны – будет удалять все комментарии, в тексте которых будет встречаться какая-либо контактная информация. Для этого в файл «functions.php» добавим строки:
add_filter('preprocess_comment', 'robocomment');
function robocomment($data) {
if ($_POST['url']) die('Spam must die!');
if (preg_match ("/http/i", $_POST['comment']))
die('В комментарии запрещено добавлять адреса сайтов!');
if (preg_match ("/icq/i", $_POST['comment']))
die('В комментарии запрещено добавлять адрес ICQ!');
if (preg_match ("/@/i", $_POST['comment']))
die('В комментарии запрещено добавлять e-mail!');
if (preg_match ("/skype/i", $_POST['comment']))
die('В комментарии запрещено добавлять контактную информацию!');
return $data;
}
Тут строка
if ($_POST['url']) die('Spam must die!');
проверяет, не был ли введен адрес сайта в скрытое поле для ввода url, и если в это поле было что-то введено – комментарий не принимается. Все нижележащие строки проверяют, есть ли в комментариях запрещенные слова типа "http", "icq", "@", и если есть – комментарий опять же удаляется.
После всех этих изменений спам практически исчез! А ввод «нормальных» комментариев стал проще, так как я даже убрал за ненадобностью капчу.