Сейчас при стремительном развитие Интернета очень остро стоит проблема спама/флуда и прочих видов нежелательных сообщений, в результате этого даже на самых простых гостевых книгах/формах стоят капчи, что в большинстве случаев очень напрягает тем более что угадывать значение получается не всегда с первого раза.
Идея защиты от спама средствами JavaScript состоит в следующем:
- На страницу в форму добавляем скрытое поле с определенным именем и ID
- средствами php генерируем уникальный ключ, генерируем JS скрипт который будет присваивать значение этого ключа скрытому полю по его ID
- Производим абфускацию JS кода, и выполняем его в браузере пользователя.
(Абфускация кода нужна для того чтобы ключ не выводился на странице в открытом виде, а получался в результате выполнения скрипта) - При субмите формы проверяем значение скрытого поля, и сгенерированного ключ, если значения совпадают значит все OK.
Такая схема не требует от пользователя никаких действий, у него всего лиш должен быть включен JavaScript, а вот спамерам жизнь затруднит. Конечно значение ключа можно выдрать из DOM и пройти проверку, НО для этого необходимо выполнить JS код средствами спамера , т.к. это не линейная задача (не для PHP) 90% быдло-кодеров с этим не справятся;)
Скриптов по обфускации JS довольно много (я использовал Dean Edwards JavaScript Packer) поэтому задача свелась к написанию функции генератора кода и функции проверки ключа.
array gen_js_key()
Функция для генерация ключа и кода. Возвращает ассоциативный массив, значение ключа сохраняет в $_SESSION['js_key']
Ключи возврашаемого массива:
[js_key] - униальный ключ
[input] - скрытое поле с уникальным именем и id
[js] - абфусцированный JS код для ыполнения на стороне юзера
bool check_js_key()
Проеряет ключ. Нужно вызывать после субмита формы.
Пимер использования:
<? include('JavaScriptCaptcha.php'); if(!empty($_POST['knopka'])) { if(check_js_key()) echo 'вы ввели <b>'.htmlspecialchars($_POST['txt']).'</b><br>'; else echo 'Ключ не подходит<br>'; } ?> <div id="testjs"> <h1><b>JavaScript отключен! включите..</b></h1> </div> <body OnLoad="JavaScript:window.document.getElementById('testjs').style.display = 'none'"> <form method=post> <input type=text name=txt> <? $r = gen_js_key(); echo $r['input']; ?> <input type=submit name=knopka> </form> <script type="text/javascript"> <?=$r['js']?> </script>
В архиве 3и файла:
class.JavaScriptPacker.php – класс обйускации JS
JavaScriptCaptcha.php – файл с необходимыми функциями для генерации и проверки кода
Index.php – пример использования
Июнь 13th, 2009 at 5:54
прикольно
Июль 15th, 2009 at 14:11
Но не во всех браузерах Java Script включен )
Сентябрь 19th, 2009 at 11:05
Спасибо большое. Установил, пока что спама не видно
Ноябрь 6th, 2009 at 16:04
По статистике только у 1-5% клиентов отключен JavaScript. Да и не факт, что большая их часть настоящие пользователи, а не боты. В целом идея хорошая. Надо будет попробовать ее реализовать у себя. Спасибо.