0

Captcha - protegendo formulários contra ataques automatizados

criado por Ricardo Maia em 04/04/2006 7:04pm
Acredito que o fonte dos arquivos já foi bem comentado... portanto vamos direto ao assunto!!!

(captcha.php)
<?php
function captcha($nome_da_imagem, $fonte){ // captcha ( "nome da imagem sem extensão", "nome da fonte com extensão")

   
// cria o objeto imagem. o usuario do apache de ter permissao de escrita no diretorio.
    $img
= imagecreatetruecolor ( 200, 60 ); //imagecreate ( largura, altura )

   
// define uma matriz contendo as cores de fundo para a imagem.
    $background
[0] = imagecolorallocate( $img, 250, 250, 250);
    $background
[1] = imagecolorallocate( $img, 240, 248, 255);
    $background
[2] = imagecolorallocate( $img, 255, 250, 205);


    imagefilledrectangle
( $img,0,0,200,60, $background[rand (0, 2 )] );


   
// alimenta uma matriz contendo as cores possiveis para os caracteres.
    $cor_fonte
[0] = imagecolorallocate( $img, 255, 185, 15 );
    $cor_fonte
[1] = imagecolorallocate( $img, 138, 43, 226 );
    $cor_fonte
[2] = imagecolorallocate( $img, 139, 131, 20 );
    $cor_fonte
[3] = imagecolorallocate( $img, 255, 20, 147 );
    $cor_fonte
[4] = imagecolorallocate( $img, 0, 154, 205 );
    $cor_fonte
[5] = imagecolorallocate( $img, 110, 123, 139 );
    $cor_fonte
[6] = imagecolorallocate( $img, 34, 139, 34 );
    $cor_fonte
[7] = imagecolorallocate( $img, 139, 139, 0 );


   
// alimenta uma matriz contento as cores possiveis para os caracteres que será utilizado como preenchimento.
   
// várias cores claras.
    $cor_fonte_preenchimento
[0] = imagecolorallocate( $img, 255, 225, 255 );
    $cor_fonte_preenchimento
[1] = imagecolorallocate( $img, 238, 224, 229 );
    $cor_fonte_preenchimento
[2] = imagecolorallocate( $img, 240, 248, 255 );
    $cor_fonte_preenchimento
[3] = imagecolorallocate( $img, 255, 239, 219 );
    $cor_fonte_preenchimento
[4] = imagecolorallocate( $img, 152, 245, 255 );
    $cor_fonte_preenchimento
[5] = imagecolorallocate( $img, 202, 255, 112 );
    $cor_fonte_preenchimento
[6] = imagecolorallocate( $img, 255, 250, 205 );

   
// cria um preenchimento randomico com letras de tamanhos e cores variadas
   
for ( $x = 0; $x < 80; $x++ ) {
        imagettftext
(
                        $img
,
                        rand
( 1, 22 ) , // tamanho do caracter.
                        rand
( 0, 360 ), // angulo.
                        rand
( 0, 220 ), // posição no eixo X.
                        rand
( 0, 60 ), // posição no eixo Y.
                        $cor_fonte_preenchimento
[ rand( 0, 6 ) ], //cor da fonte.
                       
"./".$fonte, // tipo de fonte
                        chr
( rand( 65, 122 ) ) // caracter numérico sorteado randomicamente.
               
);
   
}

    $espacamento_letra
= 20;

    $texto_captcha
= "";

   
// inicializa a variavel $y
    $y
= 0;

   
// alimenta uma matriz para limitar os angulos dos caracteres
    $angulos_possiveis
[0] = 25;
    $angulos_possiveis
[1] = -25;
    $angulos_possiveis
[2] = 0;
    $angulos_possiveis
[3] = 10;
    $angulos_possiveis
[4] = -10;


   
// sorteia randomicamente letras de A-Z
   
for ( $y = 0; $y < 5 ; $y++ ) {
       
// sorteia randomicamente numeros de 0 a 9 utilizando o seu código ASCII
       
// $caracter_temp = chr( rand( 48, 57 ) );

       
// sorteia randomicamente letras maiúsculas de A a Z utilizando o seu código ASCII.
       
// descomentar a próxima linha se quiser utilizar letras ao invés de números.
       
//$caracter_temp = chr( rand( 65, 90 ) );
        $caracter_temp
= chr( rand( 97, 122 ) );
       
        imagettftext
(
                $img
,
                rand
( 16, 26 ) , // randomiza o tamanho da fonte.
                $angulos_possiveis
[ rand( 0, 4 ) ], //randomiza o angulo do caracter.
                $espacamento_letra
, //posicao do caracter na imagem no eixo X
                rand
( 22, 50 ), // posicao do caracter no eixo Y.
                $cor_fonte
[ rand( 0 , 7 ) ], //randomiza a cor do caracter.
               
"./".$fonte, // determina qual a fonte será utilizada.
                $caracter_temp
       
);
       
       
// incrementa o espacamento das letras para que nao fiquem sobrepostas.
        $espacamento_letra
+= 38;
       
       
// alimenta uma variavel que ira concatenar os caracteres "sorteados" para posterior manipucacao.
       
// você pode por exemplo gravar o valor desta variável numa session.
       
// Ex: $_SESSION['texto_verificacao'] = $texto_captcha;
        $texto_captcha
.= $caracter_temp;
   
}

   
// faz a saída de uma imagem PNG para o browser ou arquivo.
   
ImagePNG($img, $nome_da_imagem.".png");

   
//destroi o recurso de imagem $img.
   
ImageDestroy($img);

   
// a função retornará o conteúdo da variável $texto_captcha que é uma string contendo os caracteres aleatórios gerados.
   
return $texto_captcha;
}
?>

Comentários:

Nenhum comentário foi enviado ainda.

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)