Сейчас при стремительном развитие Интернета очень остро стоит проблема спама/флуда и прочих видов нежелательных сообщений, в результате этого даже на самых простых гостевых книгах/формах стоят капчи, что в большинстве случаев очень напрягает тем более что угадывать значение получается не всегда с первого раза.
Идея защиты от спама средствами 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>
Скачать JScaptcha.rar v1.1
В архиве 3и файла:
class.JavaScriptPacker.php – класс обйускации JS
JavaScriptCaptcha.php – файл с необходимыми функциями для генерации и проверки кода
Index.php – пример использования
written by admin
\\ tags: antispam, captcha, JavaScript, PHP
Последние комментарии