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.)