Captcha - protegendo formulários contra ataques automatizados
Acredito que o fonte dos arquivos já foi bem comentado... portanto vamos direto ao assunto!!!
(captcha.php)
(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;
}
?>
Novo Comentário: