+2

Gerando imagens de segurança (CAPTCHA)

criado por Thiago Felipe Festa em 05/08/2007 1:02pm
Neste artigo iremos abordar um assunto que é muito utilizado hoje em dia, que é a utilização de imagens de segurança para a validação de formulários, gerando caracteres aleatórios.

Para isso você precisa ter a biblioteca GD instalada em seu servidor. Para mais informações acesse: http://www.php.net/manual/pt_BR/ref.image.php

Antes de mais nada, para criação deste sistema, vamos utilizar 4 arquivos PHP, dentre eles:
1º - imagem.class.php = Classe que gera a imagem
2º - imgGera.php = Arquivo que instância a classe imagem
3º - imgSet.php = Seta os valores que veremos mais a frente
4º - form.php = Um formulário simples só para testarmos o uso desta imagem

Teremos também 10 imagens que serão utilizadas como fundo:
de 0.jpg à 9.jpg

Ao término deste artigo, irei disponibilizar os arquivos para download.


Vamos começar pelo form.php

<?php
// Inicio a sessão, pois estamos trabalhando com sessões.
session_start();

// Aqui é a ação do formulário, se clicar em enviar ele chama isto.
if ($_GET["validar"] == "form") {
    // Texto digitado no campo imagem, e transformando tudo 
    // em mínúsculo, caso queria que haja distinção de 
    // maiúsculas e minúsculas, só retire o strtoupper().
    $txtImagem = strtoupper($_POST["txtImagem"]);
    
    // Caracteres que estão na imagem, também deixando tudo em minúsulo.
    $valorImagem = strtoupper($_SESSION["autenticaIMG"]);
    
    // Verificando se o texto digitado, for igual aos 
    // caracteres que estão na imagem
    if ($txtImagem == $valorImagem) {
        echo "Parabéns ". $_POST["txtNome"] .", os caracteres digitados estão corretos!";
    } else {
        echo "Desculpa ". $_POST["txtNome"] .", os caracteres digitados estão incorretos!";
    }
}

// Incluindo o imgSet.php que seta os valores da sessão.
require_once ("imgSet.php");    
?>
<!--
Notem que ali no <img src="imgGera.php">, eu chamo o arquivo imgGera.php...
estou adicionando ele, pois nele que está instânciada a classe imagem
-->
<form name="frmImgValida" action="form.php?validar=form" method="post">
<table>
  <tr>
    <td>Nome: </td>
    <td><input type="text" name="txtNome" size="20"></td>    
  </tr>
  <tr>
    <td colspan="2"><img src="imgGera.php"></td>
  </tr>
  <tr>
    <td>Imagem: </td>
    <td><input type="text" name="txtImagem" size="20"></td>    
  </tr>
  <tr>
    <td colspan="2"><input type="submit" name="btnEnviar" value="Enviar"></td>
  </tr>        
</table>

Comentários:

Mostrando 1 - 10 de 10 comentários
Maravilha, funcionou perfeitamente.
06/11/2007 11:12am (~16 anos atrás)

Já li em algumas revistas e artigos que, captcha estáticos já se consegue ler com programinhas para hacker sites alheios. Primeiramente eu queria saber se realmente é possível tal artifício, e tb perguntar se captcha animados (gerando gif) ou até mesmo expressões matemáticas, como já vi, seriam uma solução para esse problema.

[]'s
04/09/2007 9:44am (~16 anos atrás)

Não posso dizer que produzi uma 'solução'. Fiz apenas testes e consegui fazer funcionar. Quanto às complicações, não usei som de fundo e usei apenas letras maiúsculas para ter que diferenciar no áudio. Achei que o arquivo 'wave' ficaria muito grande. No meu caso, o acesso de rastreadores que conseguissem passar por isso não chegaria a ser um problema muito grande.
07/08/2007 10:11pm (~16 anos atrás)

Ítalo,
você poderia entrar em contato comigo via e-mail por favor? Estou há algum tempo pensando em criar uma biblioteca geradora de captchas, e gostaria de dar uma olhada na sua solução. Há algums aspectos mais complicados, é preciso colocar um som de fundo confuso para que rastreadores de audio captchas não quebrem a mensagem de voz, e é preciso também diferenciar entre maiúsculas e minúsculas, além de outras coisas.
O ideal era escrever uma pequena estensão para php que já gerasse a imagem, o áudio, e já printasse na tela o gráfico e o link para o áudio ... mas isso demoraria ainda algum tempo. De qualquer forma gostaria de ver sua solução, ou de conversar mais com você a respeito de como ela foi implementada.
Marlon
07/08/2007 7:34am (~16 anos atrás)

Oi Nícollas,
bom ponto esse. Mas penso que captchas redusem sim, e bastante, possibilidades de ataques a sites. Se o negócio tá difícil já com eles, pior seria sem eles.
Sou a favor do uso de captchas, em conjunto com outras medidas de segurança. E, quanto ao seu termo " a uma parte da população", creio ser uma visão deixada para trás a já algum tempo.
Enquanto o objetivo era não deixar uma parte da população sem acesso ao site, a acessibilidade era vista asism mais ou menos como uma forma de caridade na web. Hoje, a idéia é "não deixar potenciais clientes sem o serviço", o que torna acessibilidade algo mandatório para qualquer site que queira ser competitivo na área em que está.
Marlon
07/08/2007 7:29am (~16 anos atrás)

Tiago,
Devo entender a palavra "certeza" como significando "razão"?
Se sim, então ok. Do contrário, realmente não entendi sua resposta.
Acessibilidade é uma questão complexa e eu não acho razoável pedir para que um desenvolvedor pense em todos os problemas de acesso antes de codificar o sistema. O importante é, quando receber um e-mail ou notificação dizendo que um site não está acessível, ver o que pode ser feito e implementar o mais rapidamente possível.
Se alguém te notifica que um site não está acessível isso quer dizer que:
1- Seu serviço foi localizado.
2- Uma ou mais pessoas escolheram usar seu serviço, dentre os concorrentes.
3- Uma ou mais pessoas tentaram usar o seu serviço, por livre escolha, mas estão tendo dificuldades.
4- As pessoas acham que seu serviço vale tanto a pena que, em vez de migrarem para um concorrente, preferiram pedir para que você o tornasse acessível a elas.

Penso que, nessas condições, perder clientes seria um péssimo desfeixo para a solicitação, além de gerar uma certa anti propaganda que tende a crescer conforme as pessoas vão ficando mais concientes.
Obrigado por ter se preocupado em responder, e mais uma vez parabéns pelo artigo!
Marlon
07/08/2007 7:25am (~16 anos atrás)

Quanto ao 'Audio Captcha', aconselho este artigo:
http://www.ejeliot.com/pages/2

Tive dificuldades como o 'Flite' e só consegui outro sintetizador. O problema é que no caso do captcha, não queremos sintetizar o som do que está escrito e sim 'soletrar'. Então criei um array de 'fonemas' para cada letra ou número que deve ter seu som sintetizado.

Espero que ajude.
06/08/2007 10:15pm (~16 anos atrás)

Primeiro, parabéns pelo artigo, ficou muito bom.

Sobre o que nosso amigo Marlon falou, eu concordo com ele... realmente não é algo acessível para uma parte da população... Mas, também devemos levar em conta a segurança dos sistemas. O Captcha ajuda (mas não resolve) em muitos casos a prevenir ataques de negação de serviço que usam curl ou algo do tipo para sobrecarregar o servidor.
Existem pacotes como o PEAR:HTTP_FloodControl que também ajuda em alguns casos.

Obrigado.
06/08/2007 9:30pm (~16 anos atrás)

Marlon,
Obrigado por elogiar meu artigo, você tem a plena certeza sobre o que falou, não devemos pensar somente em uma parte da sociedade, e sim e toda, quando eu fiz esse artigo eu realmente não havia pensado por esse lado, porém, vou tentar corrigir o sistema, fazendo um captcha acessível a todos.
Muito obrigado pelos elogios e pelas críticas.
06/08/2007 12:36pm (~16 anos atrás)

Tiago,
Seu artigo está excelente, mas é preciso notar uma coisa muito importante a respeito dessa tecnologia:
CAPTCHAS NÃO SÃO ACESSÍVEIS. Se alguém for usar captchas em seus sites, é bom saber que estará automaticamente restringindo seu público alvo em algumas centenas de milhares de usuários pelo mundo a fora.
Para cegos que usam leitores de tela e para pessoas dautônicas, por exemplo, um site baseado em um captcha inacessível será totalmente impossível de usar.
Esse blog, em inglês, explica o que são capthchas sonoros e mostra o que, como empresa responsável, a google fez para tornar captchas acessíveis:
http://googleblog.blogspot.com/2006/11/audio-captchas-when-visual-images-are.html

Empresas hagindo de forma irresponsável, estão caindo em dois problemas nos estados unidos e fora dele:
O primeiro, que pode não interessar completamente por esses lados, é estarem fora da lei, que especifica rigorosamente que todas as informações na internet precisam ser acessíveis a todos.
O segundo, esse sim mais interessante, é que estão deixando de receber muitos acessos, que estão sendo direcionados para concorrentes que saibam respeitar diferenças entre as pessoas.

Quem pensa que deficientes estão fora do mercado está vivendo na pré história, além de ser um completo imbecil. No Brasil, que é um país ridículo do ponto de vista de inclusão, por exemplo, as vagas obrigatórias em empresas com mais de cem usuários, aliadas ao aumento da tecnologia e do nível de escolaridade, estão fazendo cada vez mais com que pessoas portadoras de deficiência tenham trabalho, em conseqüência disso renda e que, portanto, estão se tornando consumidoras de serviços, que podem muito bem envolver vossos sites.
Em países mais sérios, é claro, o número de portadores de deficiência consumidores de serviços na internet é maior, mas mesmo no Brasil eu pensaria duas vezes antes de bloquear totalmente a acessibilidade de um site que eu esteja desenvolvendo, dado que acessos e consumo são cada vez mais importantes nesse mundo concorrido, ou seja, não podemos nos dar ao luxo de perder potenciais clientes por não implementarmos algo que se faz em meia hora.
Se tiverem dúvidas sobre esse assunto não deixem de me contactar.
Marlon
06/08/2007 7:47am (~16 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)