Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mdartson

Captcha

Recommended Posts

Olá pessoal, :)

 

Estou com um probleminha no código de um sistema Captcha (aquele que a gente tem que digitar as letrinhas antes de enviar o formulário), que estou implantando em meu site porque estavam utilizando os formulários para fazer flood. Daí, por medida de segurança, quero que todo usuário antes de enviar o formulario preenchido, digite as letras/números aleatoriamente.

 

O que ocorre é que, apesar do script estar rodando certinho, toda vez que se digita os códigos, ele diz que está errado, mesmo digitando-se tudo certo.

 

Coloquei uma página de teste para que possam entender:

 

Teste

 

Este sistema que coloquei é feito com 2 arquivos.

 

O primeiro é o de gerar a imagem, chamado: imagem.php

 

<?php$largura = 180;$altura = 30;$imagem = imagecreate($largura,$altura); // cria uma imagem/*Possiveis Letras do captcha*//*'a','b','c','d','e','f','g','h','i',				'j','k','l','m','n','o','p','q','r',				's','t','u','v','w','x','y','z',				'A','B','C','D','E','F','G','H','I',				'J','K','L','M','N','O','P','Q','R',				'S','T','U','V','W','X','Y','Z',				*/$letras = array('0','1','2','3','4','5','6','7','8','9'); // neste caso o captcha terá só números$tam_letras = count($letras)-1;/*Fim possives letras*//*Cores da imagem*/$cinza = imagecolorallocate($imagem,0xF8,0xF8,0xF8);$cinza_escuro = imagecolorallocate($imagem,0xCC,0xCC,0xCC);$vermelho = imagecolorallocate($imagem,0xFF,0x00,0x00);$azul = imagecolorallocate($imagem,0x0F,0x93,0xFF);$verde = imagecolorallocate($imagem,0x00,0x66,0x00);$rosa = imagecolorallocate($imagem,0xFF,0x1A,0x98);$preto = imagecolorallocate($imagem,0x00,0x00,0x00);$marrom = imagecolorallocate($imagem,0xDC,0x91,0x3D);$laranja = imagecolorallocate($imagem,0xFF,0x8C,0x24);$cores = array($vermelho,$azul,$verde,$rosa,$preto,			   $marrom,$laranja);$tam_cores = count($cores)-1;/*Fim das cores*//*Escrevendo linhas de fundo*/$nro_linhas = 20;for($i=0;$i<$nro_linhas;$i++){	$x1 = rand(0,$largura);	$x2 = rand(0,$largura);	$y1 = rand(0,$altura);	$y2 = rand(0,$altura);	imageline($imagem,$x1,$y1,$x2,$y2,$cinza_escuro);}/*Fim linhas de fundo*//*Escrevendo arcos de fundo*/$nro_arcos = 20;for($i=0;$i<$nro_arcos;$i++){	$cx = rand(0,$largura);	$w = rand(0,$largura);	$cy = rand(0,$altura);	$h = rand(0,$altura);	$s = rand(0,360);	$e = rand(0,360);	imagearc($imagem,$cx,$cy,$w,$h,$s,$e,$cinza_escuro);}/*Fim arcos de fundo*//*Escrevendo as Letras na imagem*/$palavra = '';$xPos = 0;for($i=0;$i<6;$i++){	$xPos += rand(10,25);	$yPos = rand(10,15);	$j = rand(0,$tam_cores);	$k = rand(0,$tam_letras);	$palavra .= $letras[$k];  imagestring($imagem, 5, $xPos, $yPos, $letras[$k], $cores[$j]);}/*fim escrevendo letras na imagem*/session_name('captcha');session_start();$_SESSION['palavra'] = $palavra;header("Content-type: image/png");imagepng($imagem);imagedestroy($imagem);?>
O segundo arquivo é o do formulário: checa.php

 

<?phpsession_name('captcha');session_start();?><html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Captcha</title><body><?phpif(isset($_POST['minhaPalavra'])){  if($_SESSION['palavra'] == $_POST['minhaPalavra'])	echo 'ok';  else	echo 'errado';}?><form action="checa.php" method="post"><img src="imagem.php"><br>Digite: <input type="text" name="minhaPalavra"><input type="submit" name="ok" value="Ok"></form></body></html>
Só consegui uma vez com que funcionasse corretamente. Das outras vezes, por mais que eu dê reload e digite corretamente o código, ele só diz que está errado, apesar de estar correto.

 

Alguém pode me ajudar?????

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara,

eu dei uma lida rapida(nao testei ainda) mas parace estar tudo correto, pelo menos erro aparente eu nao observei.

voce pode ir debugando usando echos pra ver os valores das variaveis:

 

echo $_SESSION['palavra'];

echo $_POST['minhaPalavra']);

 

e tals pra ir vendo o conteudo e ver onde ta trocando o valor...

(depois eu testo e falo o resultado...)

 

Adailton:

"Dessa forma, você precisa chamar session_name() para cada requerimento (e antes de session_start() ou session_register() serem chamadas). "

http://www.php.net/session_name

tem que vir antes mesmo... =D

 

 

[]s

luis

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, pessoal. O lance é que o programa executa beleza, mas na hora do teste, quando digito as letras e números apresentados na imagem gerada, ele sempre diz que está errado, por mais que eu digite certo. :blink: Ainda não consegui solucionar isso..... :unsure: []s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, pessoal. O lance é que o programa executa beleza, mas na hora do teste, quando digito as letras e números apresentados na imagem gerada, ele sempre diz que está errado, por mais que eu digite certo. :blink: Ainda não consegui solucionar isso..... :unsure: []s

Ola,Eu testei umas 30 vezes seu script e ele funcionou perfeitamente, tanto para digitadas corretas e digitas erradas... agora o que da errado ai eu nao sei dizer nao... a session ta startando corretamente ai, a variavel post ta passando normal?? tem que ir debugando o script conforme eu tinha falado dai pode ver o que ta saindo errado...[]sluis

Compartilhar este post


Link para o post
Compartilhar em outros sites

para fazer o CAPTCHA, eu uso o Text_CAPTCHA do PEAR que é molinho de usar...da uma olhadinha nesse link...http://www.phpavancado.net/node/17t+

Interessante, Mutante.Mas uma dúvida: Eu hospedo meu site em um provedor pago. O Pear já faz parte do PHP ou eu tenho que solicitar a instalação dele? No caso dele não estar instalado, eu mesma posso instalá-lo via FTP?[]sMary

Compartilhar este post


Link para o post
Compartilhar em outros sites

checa

<?phpsession_name('captcha');session_start();?><html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Captcha</title><body><?phpif(isset($_POST['minhaPalavra'])){ if($_SESSION['palavra'] == $_POST['minhaPalavra'])echo "<script>location='http://localhost:8084/Projeto_Interdiciplinar/index.jsp';</script>"; else echo 'errado';}?><form action="checa.php" method="post"><img src="imagem.php"><br>Digite: <input type="text" name="minhaPalavra"><input type="submit" name="ok" value="Ok"></form></body></html>

imagem

<?php$largura = 180;$altura = 30;$imagem = imagecreate($largura,$altura); // cria uma imagem/*Possiveis Letras do captcha*//*'a','b','c','d','e','f','g','h','i', 'j','k','l','m','n','o','p','q','r', 's','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I', 'J','K','L','M','N','O','P','Q','R', 'S','T','U','V','W','X','Y','Z', */$letras = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); // neste caso o captcha terá só números$tam_letras = count($letras)-1;/*Fim possives letras*//*Cores da imagem*/$cinza = imagecolorallocate($imagem,0xF8,0xF8,0xF8);$cinza_escuro = imagecolorallocate($imagem,0xCC,0xCC,0xCC);$vermelho = imagecolorallocate($imagem,0xFF,0x00,0x00);$azul = imagecolorallocate($imagem,0x0F,0x93,0xFF);$verde = imagecolorallocate($imagem,0x00,0x66,0x00);$rosa = imagecolorallocate($imagem,0xFF,0x1A,0x98);$preto = imagecolorallocate($imagem,0x00,0x00,0x00);$marrom = imagecolorallocate($imagem,0xDC,0x91,0x3D);$laranja = imagecolorallocate($imagem,0xFF,0x8C,0x24);$cores = array($vermelho,$azul,$verde,$rosa,$preto, $marrom,$laranja);$tam_cores = count($cores)-1;/*Fim das cores*//*Escrevendo linhas de fundo*/$nro_linhas = 20;for($i=0;$i<$nro_linhas;$i++){ $x1 = rand(0,$largura); $x2 = rand(0,$largura); $y1 = rand(0,$altura); $y2 = rand(0,$altura); imageline($imagem,$x1,$y1,$x2,$y2,$cinza_escuro);}/*Fim linhas de fundo*//*Escrevendo arcos de fundo*/$nro_arcos = 20;for($i=0;$i<$nro_arcos;$i++){ $cx = rand(0,$largura); $w = rand(0,$largura); $cy = rand(0,$altura); $h = rand(0,$altura); $s = rand(0,360); $e = rand(0,360); imagearc($imagem,$cx,$cy,$w,$h,$s,$e,$cinza_escuro);}/*Fim arcos de fundo*//*Escrevendo as Letras na imagem*/$palavra = '';$xPos = 0;for($i=0;$i<6;$i++){ $xPos += rand(10,25); $yPos = rand(10,15); $j = rand(0,$tam_cores); $k = rand(0,$tam_letras); $palavra .= $letras[$k]; imagestring($imagem, 5, $xPos, $yPos, $letras[$k], $cores[$j]);}/*fim escrevendo letras na imagem*/session_name('captcha');session_start();$_SESSION['palavra'] = $palavra;header("Content-type: image/png");imagepng($imagem);imagedestroy($imagem);?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tendo problemas no meu 'captcha' tba dúvida que eu gostaria de tirar éno campo do formulário eu posso colocar action="<?php echo $_SERVER['SCRIPT_NAME'];?>"SCRIPT_NAME eu coloco enviar, referente ao arquivo enviar.phpou eu deixo somenteaction="enviar.php"enviar.phpé o arquivo que vai receber os valores dos campos e postar na tabela, o que acontecesse no meu formulário é que depois de todas as validações ele volta para tela do formulário e nao para a do enviar.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

starta a session primeiro e semespaço<?session_start();session_name('captcha');..... blablba

Realmente é so colocar na ordem em que o Adailton falou.Imagem.php

<?php$largura = 150;$altura = 30;$imagem = imagecreate($largura,$altura); // cria uma imagem/*Possiveis Letras do captcha*//*'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',*/$letras = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); // neste caso o captcha terá só números$tam_letras = count($letras)-1;/*Fim possives letras*//*Cores da imagem*/$cinza = imagecolorallocate($imagem,0xF8,0xF8,0xF8);$cinza_escuro = imagecolorallocate($imagem,0xCC,0xCC,0xCC);$vermelho = imagecolorallocate($imagem,0xFF,0x00,0x00);$azul = imagecolorallocate($imagem,0x0F,0x93,0xFF);$verde = imagecolorallocate($imagem,0x00,0x66,0x00);$rosa = imagecolorallocate($imagem,0xFF,0x1A,0x98);$preto = imagecolorallocate($imagem,0x00,0x00,0x00);$marrom = imagecolorallocate($imagem,0xDC,0x91,0x3D);$laranja = imagecolorallocate($imagem,0xFF,0x8C,0x24);$cores = array($vermelho,$azul,$verde,$rosa,$preto,$marrom,$laranja);$tam_cores = count($cores)-1;/*Fim das cores*//*Escrevendo linhas de fundo*/$nro_linhas = 20;for($i=0;$i<$nro_linhas;$i++){$x1 = rand(0,$largura);$x2 = rand(0,$largura);$y1 = rand(0,$altura);$y2 = rand(0,$altura);imageline($imagem,$x1,$y1,$x2,$y2,$cinza_escuro);}/*Fim linhas de fundo*//*Escrevendo arcos de fundo*/$nro_arcos = 20;for($i=0;$i<$nro_arcos;$i++){$cx = rand(0,$largura);$w = rand(0,$largura);$cy = rand(0,$altura);$h = rand(0,$altura);$s = rand(0,360);$e = rand(0,360);imagearc($imagem,$cx,$cy,$w,$h,$s,$e,$cinza_escuro);}/*Fim arcos de fundo*//*Escrevendo as Letras na imagem*/$palavra = '';$xPos = 0;for($i=0;$i<6;$i++){$xPos += rand(10,25);$yPos = rand(10,15);$j = rand(0,$tam_cores);$k = rand(0,$tam_letras);$palavra .= $letras[$k];imagestring($imagem, 5, $xPos, $yPos, $letras[$k], $cores[$j]);}/*fim escrevendo letras na imagem*/session_start();session_name('captcha');$_SESSION['palavra'] = $palavra;header("Content-type: image/png");imagepng($imagem);imagedestroy($imagem);?>

eu mudei alguma coisa aki

<?php session_start(); if ($_POST['minhaPalavra'] != $_SESSION['palavra']) { echo "ERRO";// echo "<script>location='teste.php';</script>"; } else { // include ("sendmail.php"); echo "OK"; } unset($_SESSION['palavra']); ?>

funciono certinho. o cod é bom !

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Olá Amigo,Você conseguiu recolver o problema com seu Captcha?Eu tentei usar e tambem não consegui, aparece a imagem certinho mas ele não verifica se esta certo ou errado.Se algum poder me ajudar.Meu form é esse:index.php
<?phpif(isset($_POST['minhaPalavra'])){  if($_SESSION['palavra'] == $_POST['minhaPalavra'])	echo 'ok';  else	echo 'errado';}?>		  		  		  <form method="post" name="form1" action="<?php echo $editFormAction; ?>">		  <table width="89%" align="center" class="borda_cinza">			<tr valign="baseline">			  <td width="80" align="right" nowrap><div align="left"> Nome:</div></td>			  <td width="360"><input name="nome" type="text" class="form_FontePreto" value="" size="40" onKeyPress="fcnOnlyNum()"></td>			</tr>			<tr valign="baseline">			  <td nowrap align="right"><div align="left"> Email:</div></td>			  <td><input name="email" type="text" class="form_FontePreto" value="" size="40" onKeyPress="fcnOnlyNum()"></td>			</tr>			<tr valign="baseline">			  <td align="left" valign="middle" nowrap><div align="left"> Testeminho:</div></td>			  <td><textarea name="testeminho" cols="55" rows="10" class="form_FontePreto" onKeyPress="fcnOnlyNum()"></textarea></td>			</tr>			<tr valign="baseline">			  <td nowrap align="right"> </td>			 <td>			  			 <img src="captcha.php"><br>Digite: <input type="text" name="minhaPalavra">					  			  </td>			</tr>			<tr valign="baseline">			  <td nowrap align="right"> </td>			  <td> </td>			</tr>			<tr valign="baseline">			  <td nowrap align="right"><div align="left"></div></td>			  <td><input type="submit" class="FormularioBotão" value="Inserir Testemunho" name="ok" ></td>			</tr>		  </table>		  <input type="hidden" name="MM_insert" value="form1">		</form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.