«Привет, мир! — Добро пожаловать в WordPress. Это ваша первая запись. Отредактируйте или удалите ее, затем начинайте создавать!»
Эта фраза знакома каждому, кто когда нибудь пробовал создать свой блог на движке вордпресс. Ну что-же, оставим первый пост самого ВП, дабы Вы, читающие, прониклись духом…, так сказать.
Любой новый сайт конечно же привлекает интерес ботов, в том числе и спаммерских, особенно если он построен на популярных CMS, а поскольку WordPress самый популярный блоговый движок, то апосля установки я сразу полез бороться с автоспамом, и первый мой шаг был удаление дефолтных плагинов в WordPress , в том числе и Akismet! Интересный подход к борьбе со спаммом? На сей подвиг меня воодушевила статья, найденная на просторах интернета. Однако в этой статье был описан вариант для старых версий WordPress, поэтому пришлось изобретать свой велосипед по данному принципу.
Немного теории. Автопостинг по популярным движкам проводится при помощи специальных скриптов или софта, в которых уже настроены нужные поля для заполнения, а именно имя, е-майл и собственно тело сообщения. Чтобы обмануть злую спаммерскую софтину, достаточно добавить поле с необычным именем и читать данные из него, а стандартное поле ввода визуально скрыть со страницы, в итоге реальный посетитель сайта будет писать свой комент в видимое поле (с уникальным именем) а автопостинг спамма будет слать комменты в стандартном поле. В подавляющем большинстве случаев этого вполне достаточно, если ещё и блочить юзеров, приславших коммент в стандартном поле — тогда вообще класс! Однако некоторые ситуации всё же требуют большей защиты, например у Вас очень популярный блог и спаммеры настойчиво хотят еженедельно постить на нем свои комменты со ссылками на свои порносайты ибо 100500+ уников это стоит усилий. Для этого они потрошат в браузере вашу страницу и выявляют уникальное имя вашего поля к примеру name=«no_spamm_comment» вместо стандартного name=«comment», сделали в своей базе данных запись «использовать для вашего сайта поле «no_spamm_comment», и продолжают долго и счастливо постить свои ссылки. Тут же сразу на ум приходит сделать рандомное имя поля, то есть каждый раз разное…… Этим сейчас и займемся
Итак, имеем WordPress версии 5.0 с одной стороны, и свору голодных спаммеров с другой. Реализация при помощи плагинов заметно больше нагружает движок нежели прямая правка в коде самого WordPress, а посему правим код. Для реализации нашего замысла потребуется отредактировать 4 файла:
- wp-load.php в начале, после <?php вставляем строку:
define( 'RANDOM_VALUE', 'произвольный_набор_символов' );
задаем константу с произвольным набором символов, будем её использовать как соль для хеша - wp-content/themes/ваш_шаблон/css/responsive.css вставляем строку:
.smo {display:none}
чтобы элемент не отображался на странице - wp-content/themes/ваш_шаблон/comments.php перед строкой
$comment_args = array(.....
вставляем строки:$random_name_comment=md5( RANDOM_VALUE .$GLOBALS['_COOKIE']['PHPSESSID']);
file_put_contents('tmp/'.$random_name_comment,time()+30);//именно тут ставим паузу 30 сек
генерируем условно-рандомное имя поля.
Далее чуть ниже ищем строку<p><textarea ..... name="comment".....></textarea></p>
и копипастим тут же второй экземпляр этой строки. В первой копии в тег р добавляем класс невидимости<p class="smo" ><textarea ..... name="comment".....></textarea></p>
Во второй копии меняем имя поля на рандомное<p>
<textarea ..... name="'.$random_name_comment.'".....></textarea>
</p> - wp-includes/comment.php в функцию wp_handle_comment_submission в самом начале вставляем строку:
$random_name_comment=md5( RANDOM_VALUE .$GLOBALS['_COOKIE']['PHPSESSID']);
$my_comment_timer=(is_file('tmp/'.$random_name_comment))?
file_get_contents('tmp/'.$random_name_comment):'';
, а строкиif ( isset( $comment_data['comment'] ) && is_string( $comment_data['comment'] ) ) {
$comment_content = trim( $comment_data['comment'] );
}
меняем наif($my_comment_timer >time())
file_put_contents('tmp/'.$random_name_comment,time()+
strlen($comment_data[$random_name_comment].$comment_data["comment"]));
if ( isset( $comment_data[$random_name_comment] ) &&
is_string( $comment_data[$random_name_comment] ) &&
!empty($my_comment_timer) &&
$my_comment_timer < time() )
$comment_content = trim( $comment_data[$random_name_comment] );
Вот в принципе и всё, в итоге имеем всегда разное имя поля, для реальных посетителей оно не заметно, а для автоспамма — беда. Можете тут же и протестить.