[вступление] Сейчас при стремительном развитие Интернета очень остро стоит проблема спама/флуда итд, в результате этого даже на самых задрыпаных гостевых книгах, формах связь с администрацией стоят капчи, что в большинстве случаев очень напрягает угадывать что же там написано. [идея] В форме создаем поле типа hidden, в нем будет храниться наш ключ, но присваиваться он будет не на прямую, а через Java Script. По шагам: 1 - Создаем скрытое поле 2 - генерируем средствами php ключ 3 - генерируем средствами php JS который будет присваивать значение нашего ключа скрытому полю 4 - проводим обфускацию JS кода Скриптов по обфускации JS довольно таки много, поэтому остается написать только генерацию кода и ключа Генерация js_gen.php PHP: <? function gen_js_key() { $VAR_NAME = ''; $VAR_ELNAME = genstr(3, 8); $VAR_KEY = md5($_SERVER['REMOTE_ADDR'].rand(10000, 99999)); $RET = array(); $RET['js_key'] = $VAR_KEY; $zn = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM'; for($i = rand(1, 8); $i >0; $i--) $VAR_NAME.= $zn[rand(0, strlen($zn)-1)]; $RET['input'] = '<input type="hidden" id="'.$VAR_ELNAME.'" name="js_key">'; $J1 = f_substr($VAR_KEY, $VAR_NAME); $J2 = f_url($VAR_KEY, $VAR_NAME); $JAVA = 'var '.$VAR_NAME.' = "'.$VAR_KEY.'"; '; $JAVA.= $J2.$J1; $JAVA.= 'window.document.getElementById(\''.$VAR_ELNAME. '\').value = '.$VAR_NAME.'; '; include('packer/class.JavaScriptPacker.php'); for($i = rand(1, 5); $i >= 0; $i--) { $packer = new JavaScriptPacker($JAVA, 'Normal', true, false); $JAVA = $packer->pack(); } $RET['js'] = $JAVA; return $RET; } function genstr($len, $max = 0) { if(!$max) return substr(md5(rand(10000, 99999)), 0, $len); return substr(md5(rand(10000, 99999)), 0, rand($len, $max)); } function f_substr(&$s, $var) { $i = rand(1, 10); $java = $var.' = '.$var.'.substr('.$i.', '.strlen($s)."); \n"; $a = genstr($i); $s = $a.$s.genstr(0, 10); return $java; } function f_url(&$s, $var) { $java = $var.' = decodeURIComponent('.$var."); \n"; $a = genstr($i); $s = preg_replace('/(.)/e', 'sprintf("%%%x", ord("$1"))', $s); return $java; } ?> class.JavaScriptPacker.php – какой-то класс который я нашел в нете для обфускации JS пример использования PHP: <? session_start(); if(!empty($_POST['js_key'])) { if($_SESSION['js_key'] == $_POST['js_key']) { $_SESSION['js_key'] = ''; echo 'вы ввели '.$_POST['txt'].'<br>'; } else echo 'какаято х..ня<br>'; } include('js_gen.php'); $r = gen_js_key(); echo '<form method=post><input type=text name=txt>'; echo $r['input']; $_SESSION['js_key'] = $r['js_key']; ?> <input type=submit name=knopka> </form> <script type="text/javascript"> <?=$r['js']?> </script> В данном примере не учтен случай когда JS отключен, а его нужно учитывать. Делаем проверку включен ли JS, если да то выводим данный код защиты, если нет то используем капчу, но это уже сами [заключение] Данный способ значительно облегчает жизнь пользователя, но использовать его можно далеко не везде. Для крупных проектов он не подходит, т.к можно написать “выполнение” JS и определение ключа, конечно прийдеться немного зморочеться, но в дальнейшем это оправдаеться. Зато для гостевых книг, форм обратной связи такая штука отлично подходит) Скачать: http://taran.su/16-javascript-captcha.html
1)Сможет ли декодер от Нерезуса обойти эту обфускацию? 2)Изос показывал чето подобное на jQuery 3)Молодчик+++
при желании можно написать распознование этой "капчи". имхо лучше сделать нормальную графическую\звуковую в которой хорошо подобран уровень шума и при этом она легко читаеться. и ещё одна проблема - это подходит только для веб браузеров. с телефона пользователь ничего несможет отправить через форму
если использовать этот прием в кмс, то можно будет добавить в базу распознователь и спамить дальше. если для отдельного сайта, то вполне подходит. ЗЫ хорошая идея
тут чтоб рас познать прийдеться делать eval кода, эт только средствами скриптовых языков врятли получеться реализовать