Код для защиты от ботов

  • Автор темы Автор темы DeoZ
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
Так лучше.
Хотя и без пейзажей вполне можно обойтись
правда, зачем писать в сессию MD5 от кода, я все равно не понял
 
Я делал вот так:
PHP:
<?php

header("Content-type: image/png");

$im     = @imagecreatefrompng("images/capa.png"); // из картинки с лого 
//$im     = @imagecreatetruecolor(209, 87); //можно и пустую

imageantialias($im, true); // размытость
switch(mt_rand(0, 2)){
case 0: 
    $orange = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
    $red = imagecolorallocate($im, 0x44, 0xAA, 0xFF);
    break;
case 1: 
    $orange = imagecolorallocate($im, 0xFF, 0x00, 0xFF);
    $red = imagecolorallocate($im, 0x0, 0xFF, 0x0);
    break;
case 2: 
    $orange = imagecolorallocate($im, 0x0, 0xFF, 0xFF);
    $red = imagecolorallocate($im, 0xFF, 0x0, 0x0);
    break;
default:
    break;
    
}

$h_padding = 0;
$v_padding = 0;
$num = "";
for($i = 0; $i < mt_rand(3, 6); ++$i){
    
    $h_padding += 33;
    $v_padding = 25 + mt_rand(-3, 3);
    
    if(mt_rand(0, 10) > 5){
        $height = 50 + mt_rand(-6, 6);
        $width = 14 + mt_rand(-6, 6);
    
        $x1 = $h_padding + mt_rand(-4, 4);
        $x2 = $h_padding + mt_rand(-4, 4);

        $y1 = $v_padding + mt_rand(-4, 4);
        $y2 = $v_padding + $height + mt_rand(-4, 4);

    
        imageline($im, $x1, $y1, $x2, $y2, $orange);
        imageline($im, $x1, $y1 + 1, $x2, $y2 + 1, $orange);
        imageline($im, $x1, $y1 - 1, $x2, $y2 - 1, $orange);

        imageline($im, $x1, $y1, $x1-$width, $y1+$height/2, $orange);
        imageline($im, $x1, $y1 + 1, $x1-$width, $y1+$height/2 + 1, $orange);
        imageline($im, $x1, $y1 - 1, $x1-$width, $y1+$height/2 - 1, $orange);
        $num .= "1";
    }
    else {
        $height = 50 + mt_rand(-6, 6);
        $width = 14 + mt_rand(-5, 5);
    
        $x1 = $h_padding + mt_rand(-4, 1);
        $x2 = $h_padding + mt_rand(-4, 1);

        $y1 = $v_padding + mt_rand(-4, 4);
        $y2 = $v_padding + $height + mt_rand(-4, 4);

    
        imageline($im, $x1, $y1, $x2, $y2, $orange);
        imageline($im, $x1, $y1 + 1, $x2, $y2 + 1, $orange);
        imageline($im, $x1, $y1 - 1, $x2, $y2 - 1, $orange);

        imageline($im, $x1, $y1+$height/2, $x1-$width+3, $y1+$height/2, $orange);
        imageline($im, $x1, $y1+$height/2 + 1, $x1-$width, $y1+$height/2 + 1, $orange);
        imageline($im, $x1, $y1+$height/2 - 1, $x1-$width, $y1+$height/2 - 1, $orange);
        
        imageline($im, $x1-$width, $y1+$height/2, $x1-$width+2, $y1, $orange);
        imageline($im, $x1-$width, $y1+$height/2 + 1, $x1-$width+2, $y1 + 1, $orange);
        imageline($im, $x1-$width, $y1+$height/2 - 1, $x1-$width+2, $y1 - 1, $orange);
        
        $num .= "4";
    }
}

imagestring($im, 5, mt_rand(0, 150), mt_rand(0, 50), "($num)", $red); // дебаггинг, можно закомментить 

imagepng($im);
imagedestroy($im);

?>
Я знаю, я извращенец)) За то не нужны шрифты и прилично устойчивая должна быть, т.к. позиции, цвета, углы - всё меняется))
 
Kill_Santa
Только-что попробовал на http://captcha.ru/ загрузить картинку 100х100 с домом и надписью "Новостройки там-то, телефон 1234567". Визуально читается великолепно!
Знаете как распознал? Цитирую: "668668".
Знаете, что... Вы сначала сами читать научитесь (в частности описание распознавалки с упомянутого сайта), а потом смущайте народ.

-~{}~ 01.02.08 14:00:

p.s. И на картинке написано было "Квартиры во Владимире в новостройках от застройщика". И телефон совсем другой. И картинка не 100x100.
 
Всем спасибо за внимание к вопросу! Отдельное выражение изумления наездам *****а.
Насчёт "Капчи без Капчи" действительно не так выразился, поэтому могут возникнуть разные толкования. Имел ввиду без готовых скриптов широко предлагающихся в интернете.
Особое внимание прошу уделить части вопроса про проверку введённого кода. Какими способами её можно делать? md5 в POST - тоже, конечно, один из вариантов, но, к сожалению, не надёжный.
 
Конечно будут! Ладно, если тебе так нравится проверка через SESSION, то может растолкуешь какие моменты стоить обязательно учесть для повышения уровня надёжности? Ну например что нужно создавать раздельные ключи для кода и стоит ли кидать в SESSION код в md5 или это излишне?
 
Тебе, видимо, нравится, когда тебя уговаривают.
А я вот, уговаривать не люблю.
Свободен.
 
Мда, комментарии излишни... Есть кто-нибудь более адекватный и не считающий себя центром PHP после Расмуса Лердорфа?
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху