Captcha

Тема в разделе "PHP программирование", создана пользователем nws, 21 дек 2007.

Статус темы:
Закрыта.
  1. nws

    nws Гость

    Репутация:
    0
    У меня есть 3 файла:

    В первом, generator.php, я генерирую число

    Код (Text):
    <?php

    function generator()
    {
    for ($i = 0; $i < 10; $i++)
    {
    $q = mt_rand(0, $i);
    $q1 = mt_rand(0, $i);
    $q2 = mt_rand(0, $i);
    $q3 = mt_rand(0, $i);
    }
    $string = $q . " " . $q1 . " " . $q2 . " " . $q3;
    return $string;
    }

    ?>

    Во втором, я "склеиваю" число из генератора с картинкой

    Код (Text):
    <?php
    require_once "generator.php";
    header ("Content-type: image/gif");
    $im = imagecreate (120,50);
    $black = imagecolorallocate ($im, 0, 0, 0);
    $white = imagecolorallocate ($im, 255, 255, 255);
    $x = imagesx($im);
    $y = imagesy($im);
    imagettftext ($im, 30, 0, $x-120, $y-10, $white, getcwd()."/ARIAL.TTF", generator());

    imagegif ($im);
    imagedestroy ($im);


    ?>
    В третьем, я делаю проверку: совпадает ли число введенной юзером с CAPTCHA

    Код (Text):
    <?php
    require_once "generator.php";
    @$cpt = $_POST['txt_capt'];
    if ($cpt == generator())
    {
    echo "<h1>OK</h1>";
    }
    else
    {
    exit("Vvedite text s kartinki");
    }
    ?>
    Проблема заключается в том, что generator() выдает уже новое значение, которое не совпадает со значением на картинке
     
  2. MajestiC

    MajestiC Гость

    Репутация:
    0
    Не мучайся и возьми KCaptcha http://captcha.ru/kcaptcha/

    Ты сравниваешь один generator() c другим generator(), получается сравниваешь 2 абсолютно рандомных числа.

    Надо при показе картинки сохранять в сессии значение этого генератора, а потом в 3-ем файле сравнивать то, что лежит в сессии и то, что лежит в посте.

    Порадовал =)))) От того, что ты 10 раз сделаешь цикл рандомность не увеличится.
     
  3. maykoff

    maykoff Гость

    Репутация:
    0
    Немного неверно.
    Три (два) файла:
    - в первом генерируешь число, и кладёшь его в сессию (не в куку)
    - во втором - "рожаешь" картинку
    - в третьем (это может быть и первый) - делаешь проверку.

    Если делаешь проверку там же, где генерируешь число - то проверку делать ДО генерации нового числа.
     
  4. maykoff

    maykoff Гость

    Репутация:
    0
    первый (он же третий) файл - HTML с картинкой
    Код (Text):
    <?php
    session_start();
    $answer = '';
    //проверка
    if(@$_POST['contr'] == @$_SESSION['contr_num'])
    {
    $answer = 'OK!';
    }

    //генерация числа
    mt_srand (time());
    $r = mt_rand (1000,1000000);
    $_SESSION['contr_num'] = substr ((string)$r,0,4);
    ?>
    <HTML>
    <HEAD>
    <TITLE>CAPTCHA</TITLE>
    </HEAD>
    <BODY>

    <p><b><?=$answer?></b></p>

    <FORM METHOD="post" >
    <br>
    Спам-контроль:<img src="imgcontr.php">       <INPUT TYPE="text" NAME="contr" size="4">
    <br><br>
    <INPUT TYPE="submit" NAME="submit" VALUE="GO">
    </FORM>

    </BODY>
    </HTML>
    второй файл - собственно, картинка imgcontr.php
    Код (Text):
    <?php
    require('./functions.inc');
    header ("Content-type: image/gif");
    session_start();
    $img=antiflood($_SESSION['contr_num'],'000000','00FF00','../include/comic.ttf');
    imagegif ($img);
    imagedestroy ($img);
    ?>
    comic.ttf - файл шрифта, которым собираешься писать


    функция antifllood
    Код (Text):
    function antiflood($control_number,$bgcolor,$txtcolor,$pathfont)
    {
    if(strlen((string)((int)$control_number)) != 4) return false;
    if(!file_exists($pathfont)) return false;
    $im = @imagecreate (80,30);
    $background_color = imagecolorallocate ($im,hexdec(substr($bgcolor,0,2)),hexdec(substr($bgcolor,2,2)),hexdec(substr($bgcolor,4,2)));
    $text_color = imagecolorallocate ($im, hexdec(substr($txtcolor,0,2)),hexdec(substr($txtcolor,2,2)),hexdec(substr($txtcolor,4,2)));
    mt_srand (time());
    for($i = 0;$i < 4;$i++)
    {  
    $angle=mt_rand(-30,30);
    $dh=mt_rand(-5,5);
    $df=mt_rand(-2,2);
    imagettftext ($im,(10+$df),$angle,(10+$i*15),(20+$dh),$text_color,$pathfont,substr($control_number,$i,1));
    }
    return $im;
    }
     
  5. 1c-nik

    1c-nik Гость

    Репутация:
    0
    У меня на сайте в гостевой книге стоит защита от спама с 2005 года ни одного спамерского сообщения!!!

    Все настолько просто, что сделать это реально всем. На смой странице где размещена форма для нового сообщения есть скрытое поле, в котором, с помощью скрипта на java накапливается счетчик нажатия клавиши на клавиатуру на полях формы. Значение этого поля передается серверу, если оно меньше например 10, то сообщение просто напросто не принммается.)))
     
  6. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.034
    Симпатии:
    7
    1c-nik
    просто сработал метод неуловимого джо.
     
  7. Programmer_Hard

    Programmer_Hard Гость

    Репутация:
    0
    ну тут любая капча пока не станет массовой она будет на 100% защищать от спама, пока шпамер не разберется с механизмом самой формы и кепчи...
     
Загрузка...
Похожие Темы - Captcha
  1. JohnLemon

    Решено Recaptcha в xpages

    JohnLemon, 10 июн 2015, в разделе: Lotus - Xpages
    Ответов:
    5
    Просмотров:
    921
  2. PaKo
    Ответов:
    6
    Просмотров:
    3.752
  3. slavon-x86
    Ответов:
    8
    Просмотров:
    4.540
Статус темы:
Закрыта.

Поделиться этой страницей