Функции WordPress

Защита WordPress от спама в комментариях без плагинов или антиспам своими руками за 3 минуты

Защита WordPress от спама без плагинов Привет, народ. Кто и как защищает свой блог на WordPress от спама? Плагины? Капчи? Что-то еще?

До недавнего времени я тоже прибегал к помощи всех этих инструментов, а в частности я пользовался плагином Math Comment Spam Protection, думаю, вы все решали простейшие примеры, когда оставляли у меня комментарии. Отныне никаких примеров и прочей лабуды — я сделал простейший антиспам для комментариев сайта на WordPress своими руками ;) Кстати, решение не инновационное, если понимать принцип работы спам ботов, то оно напрашивается само собой. Решение, в принципе, универсальное и подойдет для любого движка или чего угодно, лишь бы найти нужный код.

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

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

Сперва я решил найти такой антиспам плагин или капчу в которой бы невозможно было ошибиться — ничего не нашел. Потом я решил реализовать ajax-форму комментирования, которая бы отправляла комментарий или выдавала ошибку без перезагрузки страницы, и тогда бы ничего не терялось — опять безуспешно.

Третьим пришло самое гениальное решение — тупо избавиться от капчи или проверки на спам. Конечно, звучит совершенно глупо и абсолютно не гениально! Но одновременно с этими мыслями мне пришла в голову схема, благодаря которой я смогу «обломать» спам роботов.

Сейчас я опишу принцип работы спам программ, а вы сразу же поймете сами, что я хочу рассказать. Все роботы парсят страницы на предмет наличия формы <form>…</form> и инпутов <input … /> внутри нее. Каждый инпут в свою очередь имеет уникальное имя. Но имя-то уникально для движка, по этому имени скрипт выполняет определенные действия и заносит данные формы в базу. Но движок WordPress он один единственный, а сайтов на нем много, нетрудно догадаться как сделать шаблон для спам программы, по которому бы прямым запросом методом POST для определенных полей формы отправлялась нужная информация.

Короче говоря, стандартная форма комментирования в WordPress имеет следующий вид (в разных шаблонах может незначительно отличаться):

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">
 
<?php if ( $user_ID ) : ?>
 
<p>Вы вошли как <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo wp_logout_url(get_permalink()); ?>" title="Выйти из аккаунта">Выйти &raquo;</a></p>
 
<?php else : ?>
 
<label for="author"><small>Имя или псевдоним <?php if ($req) echo "(обязательно)"; ?></small></label>
<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> />
 
<label for="email"><small>E-mail (не публикуется) <?php if ($req) echo "(обязательно)"; ?></small></label>
<input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" tabindex="2" <?php if ($req) echo "aria-required='true'"; ?> />
 
<label for="url"><small>URL персонального блога</small></label>
<input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" tabindex="3" />
 
<?php endif; ?>
 
<textarea name="comment" id="comment" tabindex="4"></textarea>
 
<input name="submit" type="submit" id="submit" tabindex="5" value="Отправить комментарий!" /><?php comment_id_fields(); ?>
 
<?php do_action('comment_form', $post->ID); ?>
 
</form>

Здесь нас интересуют только три инпута со следующими именами: name=»author», name=»email», name=»url».
Это то, о чем я вам говорил — спамбот находит форму, находит в ней поля с данными именами (повторяюсь, во всех WordPress они имеют именно такие имена), и отправляет свой мусор.
Догадались, что надо сделать с этими именами? Конечно — изменить!

Так что проворачиваем примерно следующее:

<label for="author"><small>Имя или псевдоним <?php if ($req) echo "(обязательно)"; ?></small></label>
<input type="text" name="bname" id="author" value="<?php echo $comment_author; ?>" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> />
 
<label for="email"><small>E-mail (не публикуется) <?php if ($req) echo "(обязательно)"; ?></small></label>
<input type="text" name="bmail" id="email" value="<?php echo $comment_author_email; ?>" tabindex="2" <?php if ($req) echo "aria-required='true'"; ?> />
 
<label for="url"><small>URL персонального блога</small></label>
<input type="text" name="bsite" id="url" value="<?php echo $comment_author_url; ?>" tabindex="3" />

Как видите, я изменил только поля name=»…».

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

Заходим к себе на сервер по ftp (или ssh, кто как привык) и в корне сайта находим файл wp-comments-post.php
В этом файле в районе 37 строки видим следующее:

$comment_author       = ( isset($_POST['author']) )  ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = ( isset($_POST['email']) )   ? trim($_POST['email']) : null;
$comment_author_url   = ( isset($_POST['url']) )     ? trim($_POST['url']) : null;
$comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

И делаем вот так:

$comment_author       = ( isset($_POST['bname']) )  ? trim(strip_tags($_POST['bname'])) : null;
$comment_author_email = ( isset($_POST['bmail']) )   ? trim($_POST['bmail']) : null;
$comment_author_url   = ( isset($_POST['bsite']) )     ? trim($_POST['bsite']) : null;
$comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

Теперь наш движок счастлив не меньше нас, он научился понимать и принимать данные из полей формы с новыми именами!

Остался последний и самый кардинальный шаг — взять и удалить навсегда свои антиспам плагины и капчи. Поверьте — каждый комментатор скажет вам большое спасибо, ведь придется делать как минимум на одно действие меньше, а вероятность ошибки связанной с проверкой «на вшивость» вообще сводится к нулю.

Вот такие дела, ребята! Я считаю, что это крайне полезная информация, да и работоспособность проверена на себе — спама нет!


PS Кстати, я однажды уже описывал один простейший способ защиты от спама блога на WordPress без плагинов во второй части сборника полезных хаков для комментариев WordPress, см. пункт 7. Там защита основывалась на проверке реферера, но с тех пор много воды утекло, и наверняка продвинутые спамботы научились собирать и отдавать правильный реферер, так что перестраховаться не помешает.

Статьи по теме

Кнопка "Вернуться к началу"
Закрыть

Обнаружен Adblock

Пожалуйста, подумайте о том, чтобы поддержать нас, отключив свой блокировщик рекламы!