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: