Captcha

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

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

    nws Гость

    У меня есть 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 Гость

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

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

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

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

    maykoff Гость

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

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

    maykoff Гость

    первый (он же третий) файл - 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 Гость

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

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

    Kmet Well-Known Member

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

    Programmer_Hard Гость

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

    Решено Recaptcha в xpages

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

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