Como criar um CAPTCHA (para ASP e PHP)

Atualizado em 19 de Agosto de 2008
A pedidos, o Simple Captcha tem agora nova versão, a 1.2. Dentre as novidades, agora as imagens estão mais difíceis de decifrar e o formulário permite envio de e-mail! BAIXE AGORA MESMO NO LINK DESTE POST.

Atualizado em 28 de Maio de 2008
Pronto, a versão do CAPTCHA em PHP está criada e testada, usem e abusem. O link está no final deste post na seção “Downloads”. Lembrem-se de deixar algum comentário sobre a experiência com quaisquer versões que usarem. :P

 

Atenção: POST TÉCNICO
Se você não trabalha com desenvolvimento este post não será entendido por você.

Se você já fez um cadastro na internet concerteza já teve que preencher um código composto por uma mistura de letras e números embaralhados bem chato de ler, como este:

Pois bem, isto se chama CAPTCHA. Muitos formulários na internet hoje em dia são preenchidos por computadores spammerspessoas que ”extremamente ocupadas” elaboram um mecanismo para, por exemplo, preencher o seu formulário de contato de forma descontrolada com propagandas e outras porcarias, e tudo é feito automaticamente. Se o formulário inserir dados em um banco de dados, então têm-se um banco ocupando espaço com lixo, ou até pior: vírus. E é incrível como esse tipo de coisa acontece com frequência. Se eu disponibilizar um form na internet que remete para meu e-mail, pronto! é questão de minutos pra uma enxurrada de tranqueira chegar na minha caixa de entrada. 

O CAPTCHA praticamente não permite que esse problema aconteça, dependendo da complexidade do código ou da forma como ele é implementado, os spammers são capazes de burlá-los rapidinho.

Bom, em resumo, eu pensei esses dias: por que não criar o meu próprio CAPTCHA? Algo simples, pra que a idéia seja entendida. Eu estava lendo o post “CAPTCHA de pobre” do Aurélio há um tempo atrás, e decidi fazer o meu baseado no modelo do dele, que segundo ele mesmo, foi a maneira que realmente barrou os spams após várias insistentes tentativas. Se ainda te restam dúvidas sobre o que é spam, vamos à própria definição do Aurélio:

Um SPAM é um recado oportunista e indesejado, geralmente uma propaganda comercial ou links para sites pornográficos. Como se isso já não fosse irritante o suficiente, geralmente são programas que enviam estes recados automaticamente, então não adianta simplesmente apagar que ele vai ser enviado novamente. Alguns enviam diariamente esse lixo para o seu site, imagine o tamanho da dor de cabeça.
 

1º Passo: o que não pode ter num CAPTCHA

Vou explicar usando a versão para ASP, mas em PHP o esquema é o mesmo.

Para que um CAPTCHA seja realmente eficiente, em primeiro lugar deve-se pensar o que NÃO pode ter nele. E a primeira coisa é: o código que a imagem mostra embutido no código-fonte!

Em hipótese alguma pense em colocar o código/palavra/número que a imagem está mostrando em seu código como por exemplo num campo de texto tipo “hidden”. Isso é facilmente encontrado pelos programas de spam.

A segunda coisa é uma imagem mostrando algo completamente dedutível e fácil de ler como: “111″, “222″ ou mesmo: “ABC” ou “OI”, “VOCE”, etc. Spammers também lêem o que tem na tela.

Ainda segundo o próprio Aurélio, cores ou números digitados na tela para serem ”colados” no campo de texto também não funcionam.

2º Passo: elaborando como vai ser o código da imagem

Números. Este CAPTCHA que estamos elaborando não tem a garantia de ser completamente seguro, mas vamos seguir (a nível de experiência) o modelo que deu certo para o Aurélio (os quatro números completamente sem ordem lógica ou significado para estranhos) como os últimos dígitos do meu antigo celular, ou da casa em que morei, ou parte do meu RG e CPF.

Eu criei 20 imagens:

imagens para o CAPTCHA

3º Passo: o esquema

Criei um diretório imagens na raiz do meu site, e joguei todas as imagens acima lá. Para facilitar, as imagens têm nomes simples como: 1.jpg, 2.jpg, 3.jpg…

Cria-se então uma página chamada “captcha.asp”,  que ficará um nível acima do diretório imagens. A “captcha.asp” vai chamar as imagens de “imagens”, entendeu né?

Agora dentro de captcha.asp cria-se em primeiro lugar o formulário, ele vai submeter para a própria página “captcha.asp” neste exemplo só para facilitar:

<!– até aqui tudo ok, um formulário submetendo para a mesma página –>
<form action=”captcha.asp” method=”post”>
<label for=”codigo”>Digite o código ao lado:</label>
<!– o campo que receberá o código –>
<input type=”text” name=”codigo” size=”4″ maxlength=”4″ />
<!– aqui estou chamando as imagens dinamicamente, na função ASP de logo mais adiante –>
<img src=”imagens/<%= nome_imagem_gerada %>.jpg” alt=”">
<br/>
<!– um campo oculto que precisarei para informar ao ASP qual o nome da imagem gerada –>
<input type=”hidden” value=”<%= nome_imagem_gerada %>” name=”imagem” />
<!– um campo oculto que me dirá se o form está sendo submetido ou nao, já que está na mesma página–>
<input type=”hidden” value=”sim” name=”enviando” />
<input type=”submit” value=”enviar” />

Logo acima do formulário, implementei o seguinte código ASP:

<%
‘aqui eu verifico se o caso é: o form está sendo enviado
if request.form(“enviando”) = “sim” then
 ’se está sendo enviado, eu apanho o código que o usuário inseriu e o nome da imagem que foi gerada lá no form.
 codigo = request.form(“codigo”)
 imagem = request.form(“imagem”)
 
 ’um case verifica se a imagem foi 1.jpg, então ela tem o código “0266″, se foi 2.jpg então o código dela é “9032″ e assim por diante…

 select case imagem

 case 1
 cod = “0266″
 case 2
 cod = “9032″
 case 3
 cod = “5610″
 case 4
 cod = “1277″
 case 5
 cod = “0501″
 case 6
 cod = “7090″
 case 7
 cod = “2111″
 case 8
 cod = “9831″
 case 9
 cod = “0003″
 case 10
 cod = “1012″
 case 11
 cod = “5123″
 case 12
 cod = “2299″
 case 13
 cod = “6974″
 case 14
 cod = “4415″
 case 15
 cod = “7618″
 case 16
 cod = “8870″
 case 17
 cod = “1610″
 case 18
 cod = “0102″
 case 19
 cod = “6048″
 case 20
 cod = “5599″

 end select

‘ se o código digitado pelo usuário bater com os códigos que defini para cada imagem… voilá!
 if cod = codigo then
  response.write “<span style=’color:green’>Parabéns! Código correto.</span>”
 else
‘ se o código digitado pelo usuário NÃO bater com os códigos que defini para cada imagem… Código errado!
 response.write “<span style=’color:red’>Ops! Código incorreto.</span>”
 end if
 response.write “<br/><input type=’submit’ value=’voltar’ onclick=’javascript:history.back();’ />”
 response.end

‘ se o form não estiver sendo enviado, então a função “randomiza()” gera números randômicos de 1 a 20 e o número que for a bola da vez vai virar nome de uma imagem, tipo:  numero.jpg
else

 function randomiza()
 dim RndTemp
 Randomize
 RndTemp = Rnd * 19 + 1
 RndTemp= Int(RndTemp)
 randomiza = RndTemp
 end function

 nome_imagem_gerada = randomiza()

end if
%>

4ª Passo:  o desafio

Desafio você a testar a eficiência deste CAPTCHA em seu site/blog. Por que não experimenta em seu formulário de contato por exemplo? Observe bem sua caixa de entrada ou lixeira, está entrando spams ou o troço foi eficiente?

Conte-me aqui os resultados.

easycalendar

 

Observações

1. Quanto mais você proteger o diretório imagens melhor para não ter suas imagens rastreadas por programas ou indivíduos maliciosos.

2. É importante tentar criptografar partes do seu código, principalmente os que se referem aos nomes das imagens.

Download

Este post ficou enorme, mas foi preciso, então se você quiser a coisa toda mastigada fique à vontade para baixar o pacote completo do mais novo “Simple Captcha”:

Você usou? gostou? tem dúvidas, críticas, reclamações, sugestões? Deixe seu comentário neste post.

42 Respostas para “Como criar um CAPTCHA (para ASP e PHP)”


  1. 1 Val 28 Maio 2008 às 3:23 am

    Belo post Sabota, o importante é o que importa, as “adaptações” dos códigos acontecem mesmo de qualquer forma, mas se tiver a “essência” já mastigada fica bem mais prático!

    Aproveite e prepare exemplos em php para os próximos posts, assim com ruby e “baguilhinhos intessantes em javascript” que são bem úteis!

    Abraço!

  2. 2 Henrique 28 Maio 2008 às 3:30 am

    Opa! boa dica Valderrama! Ruby? bah.. eu não penso nem nisso, mas o PHP quem sabe num sai… abraço!

  3. 3 cemillen 2 Junho 2008 às 3:40 am

    Cara vc disse que o post ficou imenso, que nada, tem louco pra tudo, já vi muitos com “biblia” de baixo do braço, lendo lendo e não faz metade que tu ensina aqui, parabens…

    Christian

  4. 4 Bruno A. Pereira 16 Junho 2008 às 8:04 pm

    Henrique pelo menos comigo funcionou a versão PHP. Acho que poderia ser melhorada as imagens, por tipo uns rabiscos pra difcultar leitura automatica dos robos da tela. parabens

    continue assim.

  5. 5 bjuniow 20 Junho 2008 às 5:44 pm

    interessante =)

  6. 6 Linuz ~root 5 Julho 2008 às 9:12 am

    #####################
    #####################

    Bah!! Ridículo esse teu sistema, facilmente burlável, se pegar os 20 nomes de imagens no diretório e fizer um sisteminha do tipo..

    se for 1.jpg preencha o form com o código tal
    se for 2.jpg preencha o form com o código tal

    cara no mínimo essas imagens deveriam ser geradas pelo próprio sistema randomicamente..

    Continua tentando..

    flw..

  7. 7 Henrique 7 Julho 2008 às 4:24 pm

    Intaum Linuz ~root, fazia tempo que não via um comentário tão direto e zangado rs. Vamos la…a idéia desse captcha nao é ser um sistema complexo e infalível, e sim uma abordagem rápida do negócio, afim colaborar para evitar SPAM. Explicando assim tudo mastigadinho fica batata de algum desocupado se dar ao trabalho de esmiuçar um sistema para burlá-lo, mas quem for usa-lo não precisa explicá-lo antes, não é mesmo?

    Ah, as imagens são sim geradas randomicamente.

    Continue participando…

  8. 8 Linuz ~root 9 Julho 2008 às 5:58 pm

    Acho que vc não entendeu quando eu disse imagens randomicamentes, pois bem, pelo menos você sabe que é totalmente vulnerável seu sistema.

    Ponto negativo mais uma vez para vc, eu não preciso ver o código fonte para achar um vulnerabilidade no seu sistema.

  9. 9 Linuz ~root 9 Julho 2008 às 6:58 pm

    Um exemplo melhorado do seu, sem levar em conta OCR ainda

    ——————–
    img.php
    ——————–

    ——————–
    capt.php
    ——————–

  10. 10 Linuz ~root 9 Julho 2008 às 7:00 pm

    ops.. tentei postar um código acima, mais tinha me esquecido q não da

    deixa pra lá, qualquer coisa entra em contato

    flw..

  11. 11 Dede 7 Agosto 2008 às 7:47 pm

    mas como envio esse formulário por e-mail depois da verificação do código?
    Estou fazendo em asp, usando o cdosys

    Se alguém puder me dar uma força
    valeu

  12. 12 Henrique 8 Agosto 2008 às 2:12 pm

    Então Dede.. espero que o código que te enviei por e-mail tenha sido util. Valeu pelo comentário!

  13. 13 Luiz Carlos Cichetto 8 Agosto 2008 às 5:50 pm

    Henrique… Muito bom o artigo, simples mas funcional. Mas tenho a mesma dúvida que DEDE, tentei montar dentro de meu formulário, mas deu pau pra todo lado. Se puder mandar ou publicar, te agradeço.

  14. 14 weslley 11 Agosto 2008 às 2:23 pm

    Amigo estou com uma duvida fiz um mural de recados e gostaria de implementar esse captcha para poder evitar esse tipo de boot pois tem um desocupado que envia mas de 500 recados em um só dia fazendo com que meu site fique fora do ar tudos os dias por passar o tamanho de trafego.

    voce poderia me dar uma força sou nativo em programação e uso PHP.

  15. 15 weslley 11 Agosto 2008 às 2:41 pm

    Outra coisa brother, fiz o dowload só que quando executo o captcha tipo, quando vai ou browser ele não aparesse a imagem tipo fica um quadradinho e um X não mostra a imagem de forma alguma.

    fico no aguardo so seu help blz

  16. 16 Henrique 11 Agosto 2008 às 3:57 pm

    Luiz: espero que o código sirva… obrigado pelo comentário.
    Weslley: eu te respondi por e-mail como funcionam as imagens ok? é simples! qualquer coisa estou às ordens. valeu por todo o interesse!

  17. 17 weslley 11 Agosto 2008 às 4:54 pm

    Amigão ate ai blz eu ja verifiquei em relação ou caminho, tipo ele esta chamando imagens blz so que de qualquer forma a imagem não aparesse a não ser que eu vá ate o codigo e direcione para qualquer uma das imagens veja so o codigo não alterei nada.

    Qual digite o código ao lado:

    <img src=”imagens/.jpg”>

    <input type=”hidden” value=”" name=”imagem” />

    ele esta direcionando para a pagina imagens etc, ate ai blz mas o lance e que não mostra a mesma entende.

    um abraço irmão fique com deus aguardo seu retorno e obrigado pela atença.

  18. 18 weslley 11 Agosto 2008 às 5:57 pm

    e ai amigão entendeu meu problema?

    vou tentar se mais claro, e o seguinte, eu fiz o download do captcha so que quando o executo ele não abri a parte da imagem bem fiz o que me pediu para ver em relação ou caminho mas não resolveu, tipo esta tudo certo pois não alterei nada, ele não encontra a imagem mesmo? não se porque? ja coloquei ate o caminho inteiro tipo img src = “http://localhost/captcha/imagebs”….. mas não foi ele não aparesse a imagem de forma alguma.

    fico no aguardo amigão do seu contato, pois como te disse estou sendo alvo de um boot que manda mais de 500 mensagens diarias no meu mural de recados, então acho que com esse captcha firá menos vulneravel os ataque boot acho que o nome e flood, fica mandando mensagens constantemente e acaba tirando meu site do ar por ecesso de trafego.

    um abraço estou a postos.

  19. 19 Henrique 12 Agosto 2008 às 12:54 pm

    Weslley e demais pessoas com algum problema,

    Este código foi testado várias vezes pra não ter erro, mas estarei fazendo uma revisão no seu funcionamento pra garantir que tudo está normal. Talvez esteja na hora de alguma revisão que facilite a instalação/configuração.

    obrigado a todos!

  20. 20 weslley 12 Agosto 2008 às 2:00 pm

    Henrique amigão, enviei para seu email o captcha, espere que consiga sanar meu problema, mesmo assim obrigado pela atenção.

  21. 21 weslley 14 Agosto 2008 às 4:26 pm

    e ai henrique, conseguiu ver o lance do codigo que te mandei por e-mail.
    um abraço espero seu retorno.

  22. 22 glacial 18 Agosto 2008 às 2:27 pm

    ótimo post. vai quebrar um galhão no meu site :)

  23. 23 Priscilla 18 Agosto 2008 às 4:30 pm

    Gostaria de sabe como mas como envio esse formulário por e-mail depois da verificação do código?

    Obrigada Priscilla
    priscillinha29@gmail.com

  24. 24 Vicentine 18 Agosto 2008 às 8:46 pm

    ei amigo,
    obrigado pelas dicas, mas tem um problema
    para mim que sou leigo na area:

    salvei os arquivos e sao dois:
    os numeros e
    captcha.php
    qual o segredo para abrir esse captcha.php?

    abraço

  25. 25 Henrique 19 Agosto 2008 às 2:56 pm

    Pessoal, eu havia disponibilizado ontem a versão 1.2 do captcha, mas surpreendentemente o meu servidor deu de desatualizar o arquivo sozinho. Então hoje a noite ela estará no ar. Aguardem.

    Vicentine,

    Respondi sobre o captcha.php por e-mail, e sobre a sua dúvida sobre o que é um servidor PHP, aconselho o link:

    http://br.php.net/tut.php

    abraços!

  26. 26 weslley 19 Agosto 2008 às 8:37 pm

    Henrique ficarei no aguardo, do novo captcha e o manual de uso, um abraço.

    por favor mande-me um e-mail quando estiver tudo Ok sim.

  27. 27 Vicentine 21 Agosto 2008 às 12:52 pm

    Henrique
    obrigado pela atenção,
    estou estudando tudo isso, mas, é dificil esse caminho…putzzzzzzz..
    enquanto isso continuo recebendo centenas de
    emails automaticos..

    abraço

  28. 28 Henrique 21 Agosto 2008 às 1:10 pm

    Vicentine, espero que a versão 1.2 do Simple Captcha resolva o seu problema com os e-mails automáticos. Na dúvida de como instalar tem até manual. Abraço

  29. 29 André 2 Setembro 2008 às 6:56 am

    Obrigado camarada!
    Não agentava mais ver email chegando na minha caixa vindo do meu form com SPAM

    Abração!

  30. 30 Diego Emidio 30 Setembro 2008 às 3:31 pm

    Parabéns e obrigado cara.

    Código simples e objetivo.
    muito bom.

    Valeu por disponibilizar com todos nós.

    Abraços

  31. 31 Eder Augusto 15 Outubro 2008 às 7:15 pm

    Parabéns… Um bom começo para quem quer se aprofundar neste assunto (CAPTCHA).

    Abraços

  32. 32 Henrique 15 Outubro 2008 às 8:24 pm

    Valeu gente! Fico muito feliz em saber que além de usar vocês carinhosamente comentaram suas experiências.

    Uma dúvida: você realmente conseguiram ver o Manual de Instruções dentro do pacote .ZIP que eu disponibilizei mais recentemente?

    valeu!

    Ah, Eder:

    Então ne, eu procurei ser didático e simples ao bolar o CAPTCHA. Estou trabalhando em novidades que pretendo publicar em breve. grande Abraço

  33. 33 Hanks 12 Novembro 2008 às 7:37 pm

    uashuahsushaushuhusuhahhahahhahahahayhhahaushaushauhsu!

    Que legal! Gostei do fato de você compartilhar o teu conhecimento sobre captchas, pena que teu sistema é extremamente frágil, e de maneira alguma seria usado em algo mais importante que trabalhe com informações sigilosas.

    Velho, só te dou uma dica: faz com que teu sistema gere as imagens. Em ASP não sei se dá pra fazer isto, mas tenho quase certeza que sim. Mas caso não seja possível passa para php que você faz isso numa boa.

    Abraço! E valeu pela iniciativa!

  34. 34 Henrique 12 Novembro 2008 às 8:58 pm

    Poxa, um leitor sorridente! Que bacana! :)

    Então né Hanks *suspiro e pausa*… rs… insegurança, fragilidade, simplicidade. Vez por outra eu recebo um comentário de alguém analisando o meu código e me falando que ele representa alguma dessas palavras. Aí eu sempre respondo dizendo o que o SIMPLE Captcha é simplesmente: simples. Assim como o EASY CALENDAR é para ser fácil. A idéia foi puramente didática. Foi mostrar em linhas gerais como um captcha funciona, foi introduzir o assunto, foi experimentar. Entendes? A criatividade do leitor é o que quero ver. Inclusive gerando imagens, colocando mais segurança, aumentando o número de códigos, colocando novos desenhos, etc, etc…

    Fico feliz pela sua participação, apareça sempre.

    abraço

  35. 35 Williams Daurte 17 Novembro 2008 às 10:28 pm

    Parabéns Henrique, estava precisando disso me indicaram no imasters e vou fazer uso e agora você faz parte de meus favoritos.

    Abraços

  36. 36 Vitor A. Vale 10 Fevereiro 2009 às 1:27 am

    Primeiramente parabéns ai, foi uma grande idéia, passando por sua idéia modifiquei para que ele gerasse aleatóriamente números e letras up e low, e não foi muito complicado ;D

  37. 37 Henrique 10 Fevereiro 2009 às 1:55 am

    Vitor, fico feliz por você aderir ao Simple captcha. Espero que tenha sucesso utilizando. Apareça por aqui mais vezes. Abração

  38. 38 Sergio 26 Março 2009 às 3:49 am

    Olá Henrique, parabéns é pouco para uma pessoa dedicada como você que provavelmente deixa de fazer outros compromissos para poder dedicar à nós eternos aprendizes da vida.

    Eu estou dando os primeiros passos, engatinhando ainda na programação PHP e acho super interessante estes novos recursos que estão surgindo para facilitar e melhorar a cada dia o trabalho que é feito para os clientes e claro, proporcionando condições de evitar possíveis SPAMS…

    Eu cheguei a baixar o seu arquivo para PHP mas se você puder me dar uma ajudazinha ficaria muito grato, para isto basta entrar em contato comigo para que eu possa colocar as minhas atuais necessidades e quem sabe você poderia doar um pouco mais do seu iluminado conhecimento para esta nova mente pensante em busca constante de inovação ?!

    Agradeço desde já e continue proporcionando para nós seus conhecimentos através de uma didática clara e objetiva, e devemos lembrar que “Nem Jesus que é a forma perfeita da perfeição conseguiu agradar a todos”.

  39. 39 Henrique Araujo 28 Março 2009 às 11:11 pm

    Fala Sérgio!!!

    Antes de mais nada quero te dizer que fiquei muito feliz que você tenha
    lido e gostado do artigo sobre captcha. Pode ficar certo que elogios assim
    à minha pessoa me dão injeções de ânimo para continuar escrevendo. Muito
    obrigado.

    A minha intenção, como você falou, é facilitar a vida das pessoas, é
    passar o que sei de forma a trazer soluções práticas e úteis à elas.

    Posso sim te ajudar, com maior prazer. Do que precisa?

  40. 40 Denis 15 Abril 2009 às 6:29 pm

    Nunca precisei criar um captcha. Mas se eu fosse criar, faria da seguinte forma:
    -Crio uma tabela no banco de dados com os campos código e imagem
    -O campo código armazenará o que a imagem mostra e o campo imagem armazenará a imagem em binário
    -Quando o usuário digitar as letras e númerios, eu converto a imagem para binário e busco no campo código o que está escrito na imagem, comparando com o que o usuário digitou

    Seria seguro assim?


  1. 1 Simple Captcha (versão 1.2) « henrique · araujo Trackback em 8 Abril 2009 às 1:18 am

Deixe uma resposta




Esse aí na foto...

Yeah! Este sou eu!

Henrique Eduardo Araujo

Twitter

Categorias

Leituras Importantes:

Dias p/ o Aniversário do Blog

Aniversário deste blog

Catraca

  • 25,422 visitantes
Licença Creative Commons