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

Статус
В этой теме нельзя размещать новые ответы.

Фанат

oncle terrible
Команда форума
Так лучше.
Хотя и без пейзажей вполне можно обойтись
правда, зачем писать в сессию MD5 от кода, я все равно не понял
 

SpYeR

Новичок
Я делал вот так:
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);

?>
Я знаю, я извращенец)) За то не нужны шрифты и прилично устойчивая должна быть, т.к. позиции, цвета, углы - всё меняется))
 

kruglov

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

-~{}~ 01.02.08 14:00:

p.s. И на картинке написано было "Квартиры во Владимире в новостройках от застройщика". И телефон совсем другой. И картинка не 100x100.
 

DeoZ

Новичок
Всем спасибо за внимание к вопросу! Отдельное выражение изумления наездам *****а.
Насчёт "Капчи без Капчи" действительно не так выразился, поэтому могут возникнуть разные толкования. Имел ввиду без готовых скриптов широко предлагающихся в интернете.
Особое внимание прошу уделить части вопроса про проверку введённого кода. Какими способами её можно делать? md5 в POST - тоже, конечно, один из вариантов, но, к сожалению, не надёжный.
 

DeoZ

Новичок
Конечно будут! Ладно, если тебе так нравится проверка через SESSION, то может растолкуешь какие моменты стоить обязательно учесть для повышения уровня надёжности? Ну например что нужно создавать раздельные ключи для кода и стоит ли кидать в SESSION код в md5 или это излишне?
 

Фанат

oncle terrible
Команда форума
Тебе, видимо, нравится, когда тебя уговаривают.
А я вот, уговаривать не люблю.
Свободен.
 

DeoZ

Новичок
Мда, комментарии излишни... Есть кто-нибудь более адекватный и не считающий себя центром PHP после Расмуса Лердорфа?
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху