Раз уж Dandr решил опубликовать мой способ, надо бы сделать канонический вариант инструкции.
Итак. Смысл — боты обычно не заполняют форму на сайте, а шлют запрос напрямую файлу wp-comments-post.php. Спрячем его.
1. Подготовим ему замену
файл wp-comments-nospam.php (имя файла не важно, лишь бы было везде одинаковым)
dandr, про индивидуальноcть названий — разумное замечание
это должен быть php-файл, запускающий wp-comments-post.php
<?php
include('wp-comments-post.php');
?>
или
символическая ссылка на wp-comments-post.php
в шелле: ln -s wp-comments-post.php wp-comments-nospam.php
или
просто переименовываем wp-comments-post.php в php-comments-nospam.php
Замечание: в отличие от предыдущих, в этом способе придётся переименовывать также и после каждого обновления WordPress
2. Защитим старый файл
вносим в .htaccess такой код:
<Files wp-comments-post.php>
order allow,deny
deny from all
</Files>
Замечание 1: если у вас отключен доступ к файлу .htaccess, поможет только переименование
Замечание 2: если вы переименовываете файл, пункт становится необязательным (но всё равно желательным — вдруг забудете при очередном обновлении)
3. Направим комментарии в новый обработчик
Надо немного подкорректировать тему, а именно файл (обычно) comments.php
Находим форму добавления комментария. Обычно это кусок кода вида
<form action="wp-comments-post.php" method="post"...
заменим имя файла в поле action:
<form action="wp-comments-nospam.php" method="post"...
Замечание: есть способ для параноиков — подменять имя файла в динамике джаваскриптом. 100% защиты от ботов и юзеров без джаваскрипта.
4. OpenID
Если вы используете плагин WP-OpenID, ему нужно персонально указать файл обработчика. Сначала надо было править код плагина (из-за этого я отключил у себя когда-то этот способ, точнее когда wp-openid бешено обновлялся каждые 2 дня), но теперь всё намного проще:
в wp-config.php добавляем
define(‘OPENID_COMMENTS_POST_PAGE’, ‘wp-comments-nospam.php’);
Наличие этой опции доказывает, что не я первый додумался :-D
Всё! Имеем профит, не имеем спама, хотя кое-какие боты похоже начали догадываться, тем не менее уменьшение спама в разы гарантированно.
>dandr, про индивидуальноcть названий — разумное замечание
А то ж!
В противном случае – не имеет смысла: ботам просто нужно будет подставить другое (шаблонное) имя файла.
да, конечно =)
Дык и простым парсером можно найти, куда отправлять спам =)
Мы еще усложняли задачу, добавляя еще смену имени текстарея http://habrahabr.ru/blogs/wordpress/44350/ (в комментах – с почасовой), но это обходится точно таким же парсом )). Да и давно бы пора переписать пост так, чтобы не хачить дополнительно файл – можно подключаться через хук.
аригато. надо поразбираться на досуге
оффтоп: а лишнего инвайта на хабру нету? *shy*
Подмена полей защищает гораздо лучше, но трабл в том, что придётся править плагины, которые работают с текстареа: обращение по имени, цитирование, смайлы, в конце концов.
Соответственно, после обновления плагина (как WP) процедуру правки придётся повторять. Муторно это.
> обращение по имени, цитирование, смайлы
хм… а что-то еще? я в принципе этим не пользуюсь, так что можно было бы мне-то поюзать… хотя опять-таки openid скорее всего это юзает
но тут возникает другая идея — что суррогатный wp-comments-post будет не только инклюд делать, но и некую фильтрацию проводить
типа
if($_GET[text])
{
die(‘иди нахрен, спамер!’);
}
$_GET[text]=$_GET[nospamtext];
получаем опять что-то с максимальной совместимостью со стандартами
Собственно, всё. Но с автоапдейтом фича не совместима.
Впрочем, есть какой-то плагин для автоматизации процесса. Ща постараюсь найти.
Ну, айдишник для плагинов с джаваскриптом останется тем же, а чтобы сохранить имя переменной для пхп-юза:
add_filter(‘pre_comment_author_name’,'againstspam’,1);
function againstspam($name){
if(!empty($_GET['content']))
wp_die(‘spammer’);
$_GET['content']=$_GET['newfieldname'];
return $name;
}
Т.е. еще до любых фильтров обработки имени мы реализуем защиту, а потом все идет с теми же переменными, что и обычно. А т.к. пишем мы эту фигню в functions.php нашей темы (или любой плагин), то обновлять и хачить wp-comments-post не надо.
погугли Antispam Bee – сам пока не смотрел.