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

Опубліковано: 13, вересня 2011 / Оновлене: 23 мая 2012

Привіт народ. Хто і як захищає свій блог на 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):?&gt; < 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>

<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 "/>

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

З повагою, Олександр Алаев
Опубліковано: 13, вересня 2011

Хто і як захищає свій блог на WordPress від спаму?
Модулі?
Капчі?
Щось ще?
Php echo get_option ( 'siteurl');?
Php" method = "post" id = "commentform"> <?
Php if ($ user_ID):?
Gt; < p> Ви увійшли як <a href=" <?
Php echo get_option ('siteurl'); ?
Php "> <?