Enviar por e-mail
Imprimir
Alan TuringFoto por jessie_st.amand
CAPTCHA é um teste cognitivo completamente automatizado para diferenciar entre computadores e humanos. O teste é baseado em leitura de texto ou outras tarefas de percepção visual.
Completely Automated Public Turing test to tell Computers and Humans Apart
Por que existe CAPTCHA?
Muitas pessoas se perguntam pra que serve aquela imagem com letras inclinadas e distorcidas com fundo muitas vezes riscado. É um sistema para diferenciar entre computadores e humanos? Sim. Existe muitos programas spammers espalhados na internet entrando em sites, preenchendo formulários e enviando dados sem qualquer valor. As letras são inclinadas e distorcidas para dificultar a compreensão desses programas, já que alguns tentam também decifrar a imagem. O CAPTCHA é utilizado como ferramenta anti-spam, um programa é incapaz de resolver o teste.
O CAPTCHA

CAPTCHA - Imagem gerada a cada visualização
São formuladas as perguntas:
- Quais letras são vogais?
- Quais letras são consoantes?
- Quais letras são "cor"?
* Os números não foram incluídos para evitar problema de acessibilidade, número "0" e letra "O", número "1" e letra "I".
$captcha = new Captcha();
$captcha->show();
O código cria e exibe o CAPTCHA. Porém isso não basta, o servidor precisa saber a resolução do teste para depois comparar com o valor enviado. A resolução pode ser armazenada em sessão ou Cookie.
Por sessão
$captcha = new Captcha();
// inicia a sessão
session_start();
// Grava a resolução em sessão
$_SESSION['captcha'] = $captcha->text();
$captcha->show();
Por Cookie
$captcha = new Captcha();
// Grava a resolução em cookie. Expira em 30 minutos
setcookie('captcha', $captcha->text(), time() - 1800, '/', '.exemplo.com');
$captcha->show();
O método mais seguro de armazenar a resolução e repassar para o servidor é por sessão, os dados ficam armazenados no próprio servidor. O Cookie pode ser lido pelo programa, e se o dado não estiver criptografado há grande chance do programa passar pelo teste.
Como usar?
Você pode armazenar a resolução e exibir o CAPTCHA de diversas maneiras. Um método é criar um arquivo separado para gravar a resposta do teste e retornar a imagem do CAPTCHA. Para o navegador e o usuário, esse arquivo é uma imagem. Você pode usar técnicas de reescrita de URL para camuflar o arquivo dinâmico.
O método show, que retorna a imagem, altera os cabeçalhos de resposta. Não exiba nenhuma outra informação ou o navegador não vai conseguir interpretar a imagem.
Exemplo
<?php
// Captcha.php
session_start();
$captcha = new Captcha();
$_SESSION['captcha'] = $captcha->text();
$captcha->show();
?>
<!-- formulario.html -->
<form action="enviar.php" method="post">
<img src="Captcha.php"/>
<input type="text" name="captcha"/>
...
<?php
// enviar.php
session_start();
if ($_SESSION['captcha'] != $_POST['captcha']) {
exit('Erro');
}
?>
Para recarregar (trocar) o CAPTCHA sem atualizar toda a página, basta fazer com que a Tag imagem (<img>) faça uma nova requisição. Isso pode ser feito com Javascript.
<img id="captcha" src="Captcha.php">
<input type="button" value="Problemas com a imagem?" onclick="javascript: document.getElementById('captcha').src = 'Captcha.php?' + Math.random() ">
Personalizando
O número de caracteres do CAPTCHA é 5, mas pode ser modificado para mais ou para menos. A largura da imagem é proporcional ao número de caracteres para a fonte Arial Black.
// CAPTCHA com 7 letras
$captcha = new Captcha(7);
$captcha->show();
A fonte das letras do teste é Arial Black e a fonte da pergunta é Arial. Para modificar a fonte altere o valor das variávels $font e $font2, informando o caminho completo do arquivo .ttf da fonte.
Código fonte
<?php
/**
* @author Alejandro Fernandez Moraga <moraga86@gmail.com>
*/
class Captcha {
private $text;
private $image;
public function __construct($characters=5) {
$font = './Arial_Black.ttf';
$font2 = './Arial.ttf';
$pos_ini = 20;
$font_len = 35;
$letters = array(
array('A', 'E', 'I', 'O', 'U'),
array('B', 'C', 'D', 'F', 'G')
);
$colors = array(
array(0, 0, 0),
array(255, 0, 0),
array(0, 255, 0),
array(0, 0, 255)
);
$colors_nam = array('pretas', 'vermelhas', 'verdes', 'azuis');
$colors_len = count($colors);
$this->image = imagecreate($characters * $font_len + $pos_ini * 2, 80);
imagecolorallocate($this->image, 233, 234, 235);
$avail = array(array() /* letters */, array() /* colors */);
for ($i=0; $i < $characters; $i++) {
$letter_type = rand(0, 1);
$letter = $letters[$letter_type][rand(0, count($letters[$letter_type]) - 1)];
if (empty($avail[0][$letter_type]))
$avail[0][$letter_type] = $letter;
else
$avail[0][$letter_type] .= $letter;
$color = rand(0, $colors_len - 1);
if (empty($avail[1][$color]))
$avail[1][$color] = $letter;
else
$avail[1][$color] .= $letter;
list($r, $g, $b) = $colors[$color];
imagettftext($this->image, 30, ($i % 2 == 0 ? rand(0, 25) : - rand(0, 25)),
$pos_ini + ($font_len * $i), 45,
imagecolorallocate($this->image, $r, $g, $b), $font, $letter);
}
$ask = rand(0, 1);
$options = array_keys($avail[$ask]);
$type = $options[rand(0, count($options) - 1)];
$this->text = $avail[$ask][$type];
$question = $ask ? $colors_nam[$type] : ($type ? 'consoantes' : 'vogais');
imagettftext($this->image, 10.5, 0, 5, 72, imagecolorallocate($this->image, 0, 0, 0), $font2, "Quais letras são {$question}?");
}
public function text() {
return $this->text;
}
public function show() {
header('Pragma: no-cache');
header('Cache-Control: private, no-cache, no-cache="Set-Cookie", proxy-revalidate');
header('Content-type: image/png');
imagepng($this->image);
imagedestroy($this->image);
}
}
?>
Arquivos
Referências
Comentar
RSS
RSS
teste
legal
Experiência
Interessante :)
asasas
Good Job
sdf
asd
Como utilizar este captcha?
Obrigado,
Estou recebendo o erro "Fatal error: Call to a member function text() on a non-object in /hsphere/local/home/mlbc00/mlbc.com.br/Captcha/captcha_img.php on line 8 "
zeca,
- coloca o arquivo captcha.php na raiz do seu site.
- coloca as fonts na pasta font, se nao existir vc cria.
- renomeia o caminho das fontes no arquivo captcha.php para
$font = 'font/Arial_Black.ttf';
$font2 = 'font/Arial.ttf';
- no arquivo do form de envio exemplo "seuformulario.php" coloca isso
- no arquivo captcha.php acima de -> class= captcha
vc coloca isso
session_start();
$captcha = new Captcha(6);
$_SESSION['testecaptcha'] = $captcha->text();
$captcha->show();
- no arquivo que vai vai dar o action/ação exemplo "envia.php" vc coloca
session_start();
?>
if ($_SESSION['testecaptcha'] != strtoupper($_POST['captcha'])) { echo "alert('Código de segurança inválido');window.location.href='seuformulario.php'";
}
pronto
onde nao mostrou o codigo é esse sem as tags php
?>
link com o conteudo que nao mostrou
h t t p: / / rapidshare.com/files/278820096/formulario.txt.html
Muito legal, diferente do que uso.
asdfsdfsadf
No meu não aparece a imagem!!!
doido
Olá amigo, estou com problemas em testa o captcha.
A imagem gerada não aparece.
Cliquei em exibir imagem e aparece uma messagem de erro fatal:
função desconhecida: imagecreate
$this->image = imagecreate($characters * $font_len + $pos_ini * 2, 80);
baixei um pacote da www.phpcaptcha.org, e no teste informou que o meu php não suporta ttf, pd. Tentei achar a extenção no php.ini para habilitar, mas não achei.
Uso o WAMP5 e meu php é versão 5.23
Você pode me ajudar? Grato.
Legal, gostei do tutorial