Nossos pensamentos, nossas atitudes, nossas emoções, tudo são formas de energia, constantemente influenciando o mundo a nossa volta. (Diane Dreher)

logo Moraga  
Principal
Categorias
Ferramentas

telescópio

Semanal Mensal Geral
  1. Converter Byte em KB, MB, GB, TB, EB
  2. Verificar CPF com PHP
  3. Jogo da velha ou Tic tac toe
  4. Captcha em PHP
  5. createElement - Solução compatível com os navegadores
  6. removeChild - Remover elementos HTML por Javascript
  7. Copiando tabelas e removendo registros duplicados no MySQL
  8. Gerando Thumbnails com PHP
  9. Removendo linhas e espaços em branco de strings
  10. Apache Expires Header - Cache de imagens, Javascript e CSS
  1. Converter Byte em KB, MB, GB, TB, EB
  2. Verificar CPF com PHP
  3. Captcha em PHP
  4. Jogo da velha ou Tic tac toe
  5. Copiando tabelas e removendo registros duplicados no MySQL
  6. createElement - Solução compatível com os navegadores
  7. removeChild - Remover elementos HTML por Javascript
  8. Gerando Thumbnails com PHP
  9. Removendo linhas e espaços em branco de strings
  10. Apache Expires Header - Cache de imagens, Javascript e CSS
  1. Converter Byte em KB, MB, GB, TB, EB
  2. Captcha em PHP
  3. Jogo da velha ou Tic tac toe
  4. createElement - Solução compatível com os navegadores
  5. Copiando tabelas e removendo registros duplicados no MySQL
  6. Apache Expires Header - Cache de imagens, Javascript e CSS
  7. Removendo linhas e espaços em branco de strings
  8. removeChild - Remover elementos HTML por Javascript
  9. Verificar se existe um valor no Array em Javascript
  10. Gerando Thumbnails com PHP
e-mail Enviar por e-mail imprimir Imprimir
PHP

Captcha em PHP

Por Alejandro Fernandez Moraga

Alan Turing<br/>Foto por <a rel="nofollow" href="http://www.flickr.com/photos/56379629@N00/1544709148/">jessie_st.amand</a> Alan Turing
Foto 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

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

Comentários
  • Toni 20 de Fevereiro de 2009 0:58

    teste

  • Pedro 9 de Março de 2009 14:29

    legal

  • Márcio 10 de Março de 2009 11:26

    Experiência

  • CACA-COBRA (http://webtechdesigner.com/) 28 de Março de 2009 9:38

    Interessante :)

  • a 18 de Junho de 2009 0:39

    asasas

  • Geovanny Junio 17 de Julho de 2009 18:07

    Good Job

  • fdf (www.oi.com.br) 20 de Julho de 2009 8:27

    sdf

  • qwe (http://www.google.com.br) 24 de Julho de 2009 21:12

    asd

  • Artur 3 de Setembro de 2009 14:41

    Como utilizar este captcha?
    Obrigado,

  • Zeca 9 de Setembro de 2009 16:34

    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 "

  • aragorn (www.spf.net) 11 de Setembro de 2009 18:43

    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

  • aragorn (www.spfc.net) 11 de Setembro de 2009 18:45

    onde nao mostrou o codigo é esse sem as tags php





    ?>

  • aragornn (www.spfc.net) 11 de Setembro de 2009 20:55

    link com o conteudo que nao mostrou

    h t t p: / / rapidshare.com/files/278820096/formulario.txt.html

  • Eliseu (http://www.eliseusb.com) 3 de Novembro de 2009 16:56

    Muito legal, diferente do que uso.

  • tsetse 23 de Dezembro de 2009 11:48

    asdfsdfsadf

  • Bruno Sanches 28 de Dezembro de 2009 11:10

    No meu não aparece a imagem!!!

  • jdkfj 7 de Janeiro de 2010 10:18

    doido

  • Rui 14 de Janeiro de 2010 14:40

    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.

  • Black 14 de Fevereiro de 2010 11:23

    Legal, gostei do tutorial


Comentar
captcha