Темная сторона ждет тебя, %username%.
Контакты:
icq:
jabber:
skype:
e-mail:
398-183-609
AlexDargin@jabber.ru
alex.dargin
alex@dargin.org
Спаму NET!

Спам – слово, вызывающее лютую ненависть и уже привычное для обывателя. Что поделаешь, есть такие люди, которые его рассылают и видимо неплохо получают за это.

Наша цель оградиться от спама с минимальными жертвами и затратами. Есть, конечно, очень легкий способ, который называется CAPTCHA, тест Тьюринга, но в последнее время количество постов ненависти на тему капчи просто зашкаливает. И правильно, на самых примитивных сайтах, что бы написать комментарий приходится ломать голову и глаза, а это явно не способствует повышению посещаемости. Как результат снижение процента конверсий из-за капчи. А значит нам нужен другой способ :).

Я для себя сделал все просто. Для защиты от ботов в код формы вставил простейший js код, а для защиты от «ручного» спама подключил jabber.

Наглядно

Защита от ботов делается очень просто. При загрузке страницы с формой генерируется некий хеш код для пользователя и превращается в CharCode для js. Например, вот так:

  1. $_SESSION['userhash'] = md5( time() . $_SERVER['REMOTE_ADDR'] . 'Ня!' );
  2.     
  3. $user['hash'] = Array();
  4.     
  5. for ( $i = 0; $i < strlen( $_SESSION['userhash'] ); $i++ )
  6. $user['hash'][] = ord( $_SESSION['userhash'][$i] );
  7.     
  8. $user['hash'] = implode( ',', $user['hash'] );
* This source code was highlighted with Source Code Highlighter.

В форме отправки комментария есть скрытое поле:

  1. <input type="hidden" name="userhash" value="" id="userhash">
* This source code was highlighted with Source Code Highlighter.

которое заполняется, например, при установке курсора в поле с комментарием.

  1. <textareaonfocus="o('userhash').value = String.fromCharCode({#[user]['hash']});">
* This source code was highlighted with Source Code Highlighter.

или при сабмите формы или вообще не заполняется, а хешкод добавляется в куки на window.onload где-то в куче прочего обсфуцированного js кода.

На сервере даже без каких-либо фильтров:

  1. if ( $_SESSION['userhash'] != $_POST['userhash'] ) return false;
* This source code was highlighted with Source Code Highlighter.

Теперь так просто комментарий не отправишь, а что бы отправить придется помучаться, потратить часок на написание парсеров, хотя мне хватит минуты-двух, что бы сменить защиту :) Понятно, что это делать никто не будет, но если мой блог станет вдруг ацки популярен, во что я не верю :), то спам будут слать люди, человекоимитаторы или продвинутые js боты. Вайп они таким способом не устроят, а вот намусорить могут. Но и тут уже готово решение :)

Сообщения о новых комментариях приходит в jabber и не просто сообщение, а еще и со ссылкой на прямое удаление этого комментария. Выглядит это так:

Нажимая на ссылку удалить, я полностью удаляю спамерский комментарий без ввода логина и пароля. Происходит это по уникальному для каждого комментария хешкоду. Максимум это занимает 2-3 секунды с момента написания комментария.

На сервере отправка сообщения реализуется очень просто:

  1. //load XMPP
  2. require_once 'application/dev/XMPP.php';
  3.     
  4. $conn = new XMPPHP_XMPP( 'jabber.ru', 5222, 'dargin.bot', '*******', 'xmpphp', 'jabber.ru', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO );
  5.  
  6. try {
  7.   
  8. $conn->connect();
  9. $conn->processUntil('session_start');
  10. $conn->presence();
  11. $conn->message( 'AlexDargin@jabber.ru', $new_comment_text );
  12. $conn->disconnect();
  13.       
  14. } catch( XMPPHP_Exception $e ) {}
* This source code was highlighted with Source Code Highlighter.

Скачать библиотеку xmpphp можно здесь. Протокол jabber это не icq, вам не нужно качать новые библиотеки каждые 2 недели и он очень стабильно работает. Я думаю у каждого уважающего себя it’шнека должен быть jabber аккаунт.

Пробуйте

Если в этой записи блога вы в поле контактов укажете ваш реальный jabber адрес, то так же получите сообщение, как и я, сможете оценить все удобство этой системы и скорость работы, а так же удалить свой комментарий.

P.S. всегда небескорыстно помогу реализовать такое же на вашем блоге :)

Комментируют:
Dargin:
Не обижайтесь, но спамерские комментарии без контактов я удаляю :) Если будет что-то смешное оставлю :)
Me:
Спасибо! Интересный метод борьбы против спама :)
Ану-ка:
asdasdasd
MisterX:
С сессиями неудачное решение, так как пользователь может открыть несколько страниц вашего блога, и в сессию запишется хеш згенерированый последней страничкой, а значит комментарий на первой нельзя будет написать.
Dargin:
2MisterX это точно или пользователь будет писать комментарий так долго, что сессия перестанет действовать. Буду делать более умное решение.
Шеф:
Хм, а если у пользователя выключены js?
Dargin:
А если у пользователя нет браузера? :) Такой бред даже не рассматривается :)
letchik:
Интересная идея, спасибо. А с сессиями можно решить проблему записывая не одно значение, а несколько (массивом) и искать в нем.
Dargin:
Да, подумываю либо держать эти значения в БД либо просто показывать уведомление, что пользователь не похож на человека :)
Spectrum:
Отличная идея, а вы уверены, что например это будет работать на браузерах в телефонах? айфонах и прочей фигне? ))
Dargin:
В последнее время я убедился, что для этого нужны wapверсии сайтов, но можно сделать и с обычной, если поставить себе такую цель. Например, miniopera поддерживает простейший js.
tema.daxter:
хороший вариант
dimzon:
Прикольно, но к сожалению1) обязательно найдутся люди у которых к примеру отключен JavaScript2) для действительно популярных ресурсов не годится, там целенаправленно напишут парсер...
xlife:
удивительно!