Привіт, народ. Хто і як захищає свій блог на WordPress від спаму? Плагіни? Капчі? Що ще?

До недавнього часу я теж вдавався до допомоги всіх цих інструментів, а зокрема я користувався плагіном Math Comment Spam Protection, думаю, ви все вирішували найпростіші приклади, коли залишали у мене коментарі. Відтепер ніяких прикладів та іншої лабуди — я зробив найпростіший антиспам для коментарів сайту на WordPress своїми руками 😉 до Речі, рішення не інноваційне, якщо розуміти принцип роботи спам ботів, то вона напрошується сама собою. Рішення, в принципі універсальна і підійде для будь-якого движка або чого завгодно, лише б знайти потрібний код.

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

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

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

Третім прийшов саме геніальне рішення — тупо позбутися капчі або перевірки на спам. Звичайно, звучить зовсім нерозумно і абсолютно не геніально! Але одночасно з цими думками мені прийшла в голову схема, завдяки якій я зможу «обламати» спам роботів.

Зараз я опишу принцип роботи спам програм, а ви одразу ж зрозумієте, що я хочу розповісти. Всі роботи парсят сторінки на предмет наявності форми … і инпутов всередині неї. Кожен инпут в свою чергу має унікальне ім’я. Але ім’я-то унікальне для движка, з цього імені скрипт виконує певні дії і заносить дані в базу. Але движок WordPress він один єдиний, а сайтів на ньому багато, неважко здогадатися, як зробити шаблон для спам програми, за яким би прямим запитом методом POST для певних полів форми відправлялася потрібна інформація.

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

if ( $user_ID ) : ?>

Ви увійшли як echo $user_identity; ?>. Вийти »

else : ?>
Ім’я або псевдонім if ($req) echo “(обов’язково)”; ?>
if ($req) echo “aria-required=’true'”; ?> />
E-mail (не публікується) if ($req) echo “(обов’язково)”; ?>
if ($req) echo “aria-required=’true'”; ?> />
URL персонального блогу

endif; ?>
comment_id_fields(); ?>
do_action(‘comment_form’, $post->ID); ?>

Ви увійшли як . Вийти »

Ім’я або псевдонім

E-mail (не публікується)

URL персонального блогу

ID); ?>

Тут нас цікавлять тільки три инпута з наступними іменами: name=”author”, name=”email”, name=”url”.
Це те, про що я вам казав — спамбот знаходить форму, знаходить у ній поля з даними іменами (повторююсь, у всіх WordPress вони мають саме такі імена), і надсилає своє сміття.
Здогадалися, що треба зробити з цими іменами? Звичайно — змінити!

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

Ім’я або псевдонім if ($req) echo “(обов’язково)”; ?>
if ($req) echo “aria-required=’true'”; ?> />
E-mail (не публікується) if ($req) echo “(обов’язково)”; ?>
if ($req) echo “aria-required=’true'”; ?> />
URL персонального блогу

Ім’я або псевдонім

E-mail (не публікується)

URL персонального блогу

Як бачите, я змінив тільки поля 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[‘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;

$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. Там захист ґрунтувалася на перевірці реферера, але з тих пір багато води витекло, і напевно просунуті спамботы навчилися збирати і віддавати правильний реферер, так що перестрахуватися не завадить.

З повагою, Олександр Алаєв