Альтернатива капчи

Discussion in 'PHP' started by nc.STRIEM, 16 Jun 2008.

  1. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    [вступление]
    Сейчас при стремительном развитие Интернета очень остро стоит проблема спама/флуда итд, в результате этого даже на самых задрыпаных гостевых книгах, формах связь с администрацией стоят капчи, что в большинстве случаев очень напрягает угадывать что же там написано.

    [идея]
    В форме создаем поле типа 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(38);
            
    $VAR_KEY md5($_SERVER['REMOTE_ADDR'].rand(1000099999));
            
    $RET = array();
            
    $RET['js_key']  = $VAR_KEY;
            
            
    $zn 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM';
            for(
    $i rand(18); $i >0$i--)
                
    $VAR_NAME.= $zn[rand(0strlen($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(15); $i >= 0$i--)
            {
                
    $packer = new JavaScriptPacker($JAVA'Normal'truefalse);
                
    $JAVA $packer->pack();
            }
            
            
    $RET['js'] = $JAVA;
            return 
    $RET;
        }
        
        function 
    genstr($len$max 0)
        {
            if(!
    $max)
                return 
    substr(md5(rand(1000099999)), 0$len);
            return 
    substr(md5(rand(1000099999)), 0rand($len$max));
        }

        function 
    f_substr(&$s$var)
        {
            
    $i rand(110);
            
    $java $var.' = '.$var.'.substr('.$i.', '.strlen($s)."); \n";
            
    $a genstr($i);
            
    $s $a.$s.genstr(010);
            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 nc.STRIEM, 16 Jun 2008
    Last edited: 3 Mar 2009
    3 people like this.
  2. DoDo

    DoDo Banned

    Joined:
    12 Jun 2008
    Messages:
    37
    Likes Received:
    21
    Reputations:
    4
    1)Сможет ли декодер от Нерезуса обойти эту обфускацию?
    2)Изос показывал чето подобное на jQuery
    3)Молодчик+++
     
  3. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    да сможет, об этом то и речь, но это не средствами php и не так уж просто, но возможно)
     
  4. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    при желании можно написать распознование этой "капчи". имхо лучше сделать нормальную графическую\звуковую в которой хорошо подобран уровень шума и при этом она легко читаеться.

    и ещё одна проблема - это подходит только для веб браузеров. с телефона пользователь ничего несможет отправить через форму
     
    #4 mr.The, 16 Jun 2008
    Last edited: 16 Jun 2008
  5. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    если использовать этот прием в кмс, то можно будет добавить в базу распознователь и спамить дальше. если для отдельного сайта, то вполне подходит.

    ЗЫ хорошая идея
     
    1 person likes this.
  6. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    тут чтоб рас познать прийдеться делать eval кода, эт только средствами скриптовых языков врятли получеться реализовать
     
    1 person likes this.