Спам – слово, вызывающее лютую ненависть и уже привычное для обывателя. Что поделаешь, есть такие люди, которые его рассылают и видимо неплохо получают за это.
Наша цель оградиться от спама с минимальными жертвами и затратами. Есть, конечно, очень легкий способ, который называется CAPTCHA, тест Тьюринга, но в последнее время количество постов ненависти на тему капчи просто зашкаливает. И правильно, на самых примитивных сайтах, что бы написать комментарий приходится ломать голову и глаза, а это явно не способствует повышению посещаемости. Как результат снижение процента конверсий из-за капчи. А значит нам нужен другой способ :).
Я для себя сделал все просто. Для защиты от ботов в код формы вставил простейший js код, а для защиты от «ручного» спама подключил jabber.
Наглядно
Защита от ботов делается очень просто. При загрузке страницы с формой генерируется некий хеш код для пользователя и превращается в CharCode для js. Например, вот так:
- $_SESSION['userhash'] = md5( time() . $_SERVER['REMOTE_ADDR'] . 'Ня!' );
-
- $user['hash'] = Array();
-
- for ( $i = 0; $i < strlen( $_SESSION['userhash'] ); $i++ )
- $user['hash'][] = ord( $_SESSION['userhash'][$i] );
-
- $user['hash'] = implode( ',', $user['hash'] );
* This source code was highlighted with Source Code Highlighter.В форме отправки комментария есть скрытое поле:
- <input type="hidden" name="userhash" value="" id="userhash">
* This source code was highlighted with Source Code Highlighter.которое заполняется, например, при установке курсора в поле с комментарием.
- <textarea … onfocus="o('userhash').value = String.fromCharCode({#[user]['hash']});">
* This source code was highlighted with Source Code Highlighter.или при сабмите формы или вообще не заполняется, а хешкод добавляется в куки на window.onload где-то в куче прочего обсфуцированного js кода.
На сервере даже без каких-либо фильтров:
- if ( $_SESSION['userhash'] != $_POST['userhash'] ) return false;
* This source code was highlighted with Source Code Highlighter.Теперь так просто комментарий не отправишь, а что бы отправить придется помучаться, потратить часок на написание парсеров, хотя мне хватит минуты-двух, что бы сменить защиту :) Понятно, что это делать никто не будет, но если мой блог станет вдруг ацки популярен, во что я не верю :), то спам будут слать люди, человекоимитаторы или продвинутые js боты. Вайп они таким способом не устроят, а вот намусорить могут. Но и тут уже готово решение :)
Сообщения о новых комментариях приходит в jabber и не просто сообщение, а еще и со ссылкой на прямое удаление этого комментария. Выглядит это так:

Нажимая на ссылку удалить, я полностью удаляю спамерский комментарий без ввода логина и пароля. Происходит это по уникальному для каждого комментария хешкоду. Максимум это занимает 2-3 секунды с момента написания комментария.
На сервере отправка сообщения реализуется очень просто:
- //load XMPP
- require_once 'application/dev/XMPP.php';
-
- $conn = new XMPPHP_XMPP( 'jabber.ru', 5222, 'dargin.bot', '*******', 'xmpphp', 'jabber.ru', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO );
-
- try {
-
- $conn->connect();
- $conn->processUntil('session_start');
- $conn->presence();
- $conn->message( 'AlexDargin@jabber.ru', $new_comment_text );
- $conn->disconnect();
-
- } catch( XMPPHP_Exception $e ) {}
* This source code was highlighted with Source Code Highlighter.Скачать библиотеку xmpphp можно здесь. Протокол jabber это не icq, вам не нужно качать новые библиотеки каждые 2 недели и он очень стабильно работает. Я думаю у каждого уважающего себя it’шнека должен быть jabber аккаунт.
Пробуйте
Если в этой записи блога вы в поле контактов укажете ваш реальный jabber адрес, то так же получите сообщение, как и я, сможете оценить все удобство этой системы и скорость работы, а так же удалить свой комментарий.
P.S. всегда небескорыстно помогу реализовать такое же на вашем блоге :)









