CAPTCHA – Distinguir seres humanos e computadores na Web

Programação PHP: Um tipo comum de CAPTCHA requer que o usuário identifique letras de uma imagem distorcida. Como computadores tendem não resolver, o usuário que apresentar uma solução correta é presumidamente humano.

Icon

deacaptcha-20091115.zip
235.21 KB 29725 downloads

Autor: Andrej Bodor
País: Sérvia
Site: PHP Classes

Sobre

Para ser um CAPTCHA, um sistema deve gerar automaticamente novos desafios que requerem técnicas da inteligência artificial na resolução. Você pode aprender mais sobre o significado de CAPTCHA acessando http://pt.wikipedia.org/wiki/CAPTCHA.

A classe captcha.class.php é usada justamente para exibir imagens de CAPTCHA e validar formulários, permitindo verificar se o usuário é realmente um ser humano ou um robô.

Exemplo de Captcha

Funcionamento

A classe captcha.class.php gera uma imagem com um texto aleatório retirado de um arquivo de texto (CSV) que você mesmo pode criar ou usar o “file.csv” padrão existente. O texto é processado usando fontes TrueType sobre um fundo com imagens desbotadas. A imagem gerada é armazenada em um arquivo no formato GIF, JPEG ou PNG. As dimensões das fontes e das imagens de fundo são configuráveis.

A palavra-chave de validação contida na imagem é armazenada em uma variável de sessão chamada $_SESSION[key] onde posteriormente você poderá fazer a verificação (comparação) com o texto digitado pelo usuário no campo, que deve ser capturado pelo nome $_POST[user_code].

Uso

Crie um formulário semelhante ao abaixo demonstrado:

form.php | Formulário CAPTCHA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php session_start(); ?>
<html>
  <head>
    <title>TaylorLopes.com</title>
  </head>
  <body>
    <form id="form" name="form" method="post" action="check.php" >
      <img src="captcha.class.php?usefile=1" /><p>
      <input id='user_code' name='user_code' type='text' size='10' >
      <input type='submit' value='reset' name='reset'>
      <input type='submit' value='submit' name='submit'>
    </form>
  </body>
</html>

Ao submeter o formulário, basta conferir se o texto digitado pelo usuário é igual ao texto contido na imagem.
check.php | Valida CAPTCHA

1
2
3
4
5
6
7
8
9
10
11
<?php
  session_start();
  if ($_POST[submit]){
  	if ($_SESSION[key]==$_POST[user_code]){
      $_SESSION[key]='';
      echo "Sucesso!"; // Aqui vai seu código 
      exit();
    }  
  }
  header("Location:form.php");
?>

É interessante editar o arquivo captcha.class.php e definir as opções de configurações disponíveis conforme a seguir serão demonstradas:

Opção 1 – Insere um quadro / borda na imagem | Parâmetros: 0 = não | 1 = sim


(Com borda)
 
(Sem borda)
1
2
3
<?php
  $ca->setImgFrame(1);
?>

Opção 2 – Limita o número de caracteres no texto | O padrão é aleatório de 5 a 8

1
2
3
<?php
  $ca->setNumString(3);
?>

Observação:
O método setNumString() não é indicado se você usa um arquivo CSV com palavras pré-definidas para formar o texto

Opção 3 – Caracteres utilizados para formar a imagem | Escolha uma das opções ou crie sua própria

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    // Somente caracteres maiúsculos - Não usa números!
    $ca->setCryptBase('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
 
    // Caracteres maiúsculos e números!
    $ca->setCryptBase('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
 
    // Caracteres minúsculos, maiúsculos e números!
    $ca->setCryptBase('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
 
    // Texto de um arquivo CSV com palavras pré-definidas
    $ca->setCryptFile('word/file.csv');
?>

Observação:
(1) Caso setCryptBase() ou setCryptFile() não seja definido, por padrão somente números serão utilizados
(2) No CSV, as palavras devem ser inseridas num arquivo texto comum separadas por quebra de linha

Opção 4 – Define a largura e altura da imagem | O padrão é w=150 h=60

1
2
3
4
<?php
   $ca->setWidth(200);
   $ca->setHeight(50);
?>

Opção 5 – Define o fundo da imagem


(Imagem de fundo)
1
2
3
<?php
  $ca->setImageName('image/bda.png;r');
?>

Observação:
Para setImageName() você pode definir um Array de imagens, a fim de que sejam alternadas como plano de fundo. Os parâmetros são separados por “,” (vírgula) e para cada parâmetro há uma segunda entrada que afeta a forma como a imagem de fundo é renderizada, são elas:

  s=stretch           (espalha e ajusta a imagem ao tamanho do texto)
  t=tile              (cria uma imagem lado a lado, estilo telhado)
  o=orginal           (mantém a imagem original, como ela é, sem qualquer alteração)
  r=resize            (redimensiona a imagem)

Exemplo:

<?php
  $ca->setImageName('image/mda.png;s,image/bda.png;t,image/es.jpg;o,image/cs.gif;r');
?>

Opção 6 – Aplica um padrão de efeito na imagem de fundo

As possibilidades são as seguintes:

  p=point
  l=line
  c=circle
  e=elipse
  cf=fillcircle
  ef=fillelipse
  t=text

Exemplo:

1
2
3
<?php
   $ca->setPaternType('p');   
?>

Observação:
O código acima, através do método setPaternType(), aplica o efeito “point” (Pontos) na imagem de fundo.

Outros exemplos de padrões:


(l=line)


(c=circle)


(e=elipse)


(cf=fillcircle)


(ef=fillelipse)


(t=text)

Você pode usar um ou mais desses padrões através do método setPaternRandColor() setado com “1”, que garante que o efeito será alternado aleatoriamente:

1
2
3
4
<?php
   $ca->setPaternType('p,l,c,e,cf,ef,t');
   $ca->setPaternRandColor(1);
?>

Opção 7 – Define o tipo de fonte utilizada nos caracteres

1
2
3
<?php
   $ca->setFontName('font/ariblk.ttf');
?>

Você pode usar um ou mais tipos de fontes através do método setFontName(), bem como setar o método setFontRand() com “1”, para fazer com que as fontes sejam alternadas aleatoriamente:

1
2
3
4
<?php
   $ca->setFontName('font/gilligan.ttf,font/arialbd.ttf');
   $ca->setFontRand(1);
?>

Utilize o método setFontRandColor() setado com “1” para manter uma cor diferente para cada caracter do texto:


(Com cor alternada)
 
(Sem cor alternada)
1
2
3
<?php
   $ca->setFontRandColor(1);
?>

Utilize o método setFontShadow() com “1”, para criar uma sombra (contorno) em cada caracter do texto:


(Com sombra)
 
(Sem sombra)
1
2
3
<?php
   $ca->setFontShadow(1);
?>

Mais um Post finalizado. Espero que possa ser útil na sua aplicação Web!

Total de acessos: 5653

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *