nc.STRIEM
16.06.2008, 15:32
[вступление]
Сейчас при стремительном развитие Интернета очень остро стоит проблема спама/флуда итд, в результате этого даже на самых задрыпаных гостевых книгах, формах связь с администрацией стоят капчи, что в большинстве случаев очень напрягает угадывать что же там написано.
[идея]
В форме создаем поле типа hidden, в нем будет храниться наш ключ, но присваиваться он будет не на прямую, а через Java Script.
По шагам:
1 - Создаем скрытое поле
2 - генерируем средствами php ключ
3 - генерируем средствами php JS который будет присваивать значение нашего ключа скрытому полю
4 - проводим обфускацию JS кода
Скриптов по обфускации JS довольно таки много, поэтому остается написать только генерацию кода и ключа
Генерация
js_gen.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 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCV BNM';
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
пример использования
<?
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
Сейчас при стремительном развитие Интернета очень остро стоит проблема спама/флуда итд, в результате этого даже на самых задрыпаных гостевых книгах, формах связь с администрацией стоят капчи, что в большинстве случаев очень напрягает угадывать что же там написано.
[идея]
В форме создаем поле типа hidden, в нем будет храниться наш ключ, но присваиваться он будет не на прямую, а через Java Script.
По шагам:
1 - Создаем скрытое поле
2 - генерируем средствами php ключ
3 - генерируем средствами php JS который будет присваивать значение нашего ключа скрытому полю
4 - проводим обфускацию JS кода
Скриптов по обфускации JS довольно таки много, поэтому остается написать только генерацию кода и ключа
Генерация
js_gen.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 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCV BNM';
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
пример использования
<?
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