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.
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 spammers, pessoas 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:

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.
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”:
- Baixar o Simple Captcha 1.2 (versão ASP) – 71KB |

- Baixar o Simple Captcha 1.2 (versão PHP) – 117KB |

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









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!
Opa! boa dica Valderrama! Ruby? bah.. eu não penso nem nisso, mas o PHP quem sabe num sai… abraço!
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
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.
interessante =)
#####################
#####################
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..
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…
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.
Um exemplo melhorado do seu, sem levar em conta OCR ainda
——————–
img.php
——————–
——————–
capt.php
——————–
ops.. tentei postar um código acima, mais tinha me esquecido q não da
deixa pra lá, qualquer coisa entra em contato
flw..
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
Então Dede.. espero que o código que te enviei por e-mail tenha sido util. Valeu pelo comentário!
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.
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.
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
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!
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.
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.
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!
Henrique amigão, enviei para seu email o captcha, espere que consiga sanar meu problema, mesmo assim obrigado pela atenção.
e ai henrique, conseguiu ver o lance do codigo que te mandei por e-mail.
um abraço espero seu retorno.
ótimo post. vai quebrar um galhão no meu site
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
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
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!
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.
Henrique
obrigado pela atenção,
estou estudando tudo isso, mas, é dificil esse caminho…putzzzzzzz..
enquanto isso continuo recebendo centenas de
emails automaticos..
abraço
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
Obrigado camarada!
Não agentava mais ver email chegando na minha caixa vindo do meu form com SPAM
Abração!
Parabéns e obrigado cara.
Código simples e objetivo.
muito bom.
Valeu por disponibilizar com todos nós.
Abraços
Parabéns… Um bom começo para quem quer se aprofundar neste assunto (CAPTCHA).
Abraços
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
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!
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
Parabéns Henrique, estava precisando disso me indicaram no imasters e vou fazer uso e agora você faz parte de meus favoritos.
Abraços
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
Vitor, fico feliz por você aderir ao Simple captcha. Espero que tenha sucesso utilizando. Apareça por aqui mais vezes. Abração
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”.
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?
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?
Eu tambem postei um tuto sobre captcha, se quiser dar uma conferida.
http://www.gasparimsat.com/index.php/13/05/2009/criar-um-captcha-com-o-php/