Protegendo Formulários Web de Robôs
Protegendo Formulários Web de Robôs
Marcos de Paula Muniz
Especialização em Segurança da Informação – Setembro de 2011
Faculdade Pitágoras – Uberlândia, MG – Brasil
[email protected]
Resumo. Um CAPTCHA é uma solução computacional que protege sites contra bots
através da geração de testes do tipo desafio e resposta que os seres humanos consigam
facilmente resolver, mas os programas de computador atuais não. Um CAPTCHA faz
isso desafiando o usuário a resolver um teste que um computador ainda não consiga
resolver, como decifrar caracteres distorcidos. Essa pesquisa analisa o CAPTCHA mais
usado na proteção de formulários da Internet atualmente, o reCAPTCHA, apresenta
inúmeras vantagens à utilização de um CAPTCHA, mostra como um formulário
desprotegido pode ser facilmente atacado por um bot, mostra também que alguns tipos
de CAPTCHAs convencionais estão sujeitos a ataques de OCR, mas, que o reCAPTCHA
é resistente à maioria deles.
Palavras-chave: CAPTCHA, reCAPTCHA, bot, Segurança.
Abstract. A CAPTCHA is a computer solution that protects websites against bots through
the generation of tests response challenge those human beings able to easily solve, but
actual computer programs no. A CAPTCHA does so by challenging the user to solve a
test that a computer still cannot, as deciphering distorted characters. This research
analyzes the CAPTCHA most used to protect fill forms of Internet today, the
reCAPTCHA, presents numerous advantages to using a CAPTCHA, and shows how an
unprotected form can be easily attacked by a bot, also shows that some types of
conventional CAPTCHAs are subject to attack by OCR, but that reCAPTCHA is
resistant to most of them.
Keywords: CAPTCHA, reCAPTCHA, bot, security.
Marcos de Paula Muniz
Página: 1
Protegendo Formulários Web de Robôs
1. Introdução
Os serviços de Internet estão cada vez mais populares e mais presentes no dia-a-dia das
pessoas, como mostrado por Márcio Moreira (2007).
Com esta popularização e com a utilização cada vez maior do envio de informações de
formulários Web para e-mails, os Spammers (pessoas que enviam Spam, que são e-mails
indesejados) passaram a explorar uma vulnerabilidade da função mail() do PHP que permite o
uso de formulários Web desprotegidos para enviar e-mails para outros destinatários, como
mostrado por Bruno Lustosa (2006). Para automatizar este ataque os Spammers criaram os
bots (web robot ou robôs web) de preenchimento automático de formulários Web. Jeff Yan e
Ahmad Salah El Ahmad (2008), afirmam que esses bots são utilizados, não apenas para
disseminação dos Spams em formulários Web, mas também na criação em massa de contas de
usuário em serviços Web, como serviços de e-mail por exemplo.
Para impedir o funcionamento deste tipo de bot, impedindo o preenchimento automático de
formulário Web, foi criado o CAPTCHA (Completely Automated Public Turing Test To Tell
Computers and Humans Apart), em 2000 por Luis von Ahn, Manuel Blum, Nicholas Hopper e
John Langford, uma solução computacional baseada em uma idéia da década de 1950: o Teste
de Turing, de Alan M. Turing, que identificava o que era computável. O objetivo de um
CAPTCHA é o inverso da máquina de Turing, ou seja, é distinguir os humanos dos
computadores apresentando testes em imagens que apenas humanos consigam resolver,
impedindo assim que um formulário preenchido por um bot possa ser enviado com sucesso,
afirmam Manuel Blum, Luis von Ahn, John Langford and Nicholas Hopper no site do projeto
CAPTCHA. Os testes CAPTCHAs convencionais, baseados em textos distorcidos, podem ser
facilmente quebrados, como mostrado por Jeff Yan e Ahmad Salah El Ahmad da Newcastle
University no artigo “A Low-cost Attack on a Microsoft CAPTCHA” (2008).
Neste artigo apresentamos o conceito do CAPTCHA, uma solução computacional que protege
formulários Web contra abusos por programas automatizados.
O objetivo deste artigo é reunir informações sobre o CAPTCHA e reCAPTCHA (um tipo de
CAPTCHA) para mostrar a importância da utilização desde método de proteção para
formulários Web, demonstrando como um formulário Web pode ser facilmente explorado
Marcos de Paula Muniz
Página: 2
Protegendo Formulários Web de Robôs
caso não possua a proteção adequada. Este artigo também tem o objetivo de mostrar que a
utilização do reCAPTCHA é melhor, do ponto de vista de segurança, do que a utilização de
um CAPTCHA convencional.
Começamos descrevendo os fundamentos teóricos da solução, destacando aplicações práticas
para segurança. Em seguida apresentamos o reCAPTCHA, uma implementação CAPTCHA
que é mais resistente aos tipos de ataques conhecidos atualmente contra CAPTCHAs.
Mostramos também como um formulário com alguns tipos de CAPTCHA convencionais
podem ser quebrados utilizando somente um software de OCR (Optical Character
Recognition ou Reconhecimento Ótico de Caracteres), como obter e utilizar o reCAPTCHA e
finalizamos o trabalho com nossas conclusões sobre o tema.
2. CAPTCHA
O termo CAPTCHA foi concebido em 2000 por Luis von Ahn, Manuel Blum, Nicholas
Hopper e John Langford da Universidade Carnegie Mellon.
Segundo eles, um CAPTCHA é uma imagem com caracteres distorcidos que aparecem na
base de um formulário Web, onde os usuários devem identificar e digitar os caracteres da
imagem para provarem que são humanos e não bots tentando abusarem do serviço.
Monica Chew e J. D. Tygar (2004), afirmam que um CAPTCHA deve satisfazer três
propriedades, onde os testes devem ser:
•
Fácil para os humanos resolverem
•
Fácil para uma máquina gerar
•
Difícil para uma máquina resolver. A única máquina que deve ser capaz de resolver é
aquela que gerou o CAPTCHA.
O CAPTCHA possui várias aplicações práticas para segurança, algumas delas são:
•
Prevenir Spam em comentários de Blogs.
•
Proteger contra a criação automática de contas de usuários.
•
Proteger votações de enquetes contra manipulação de resultados.
Marcos de Paula Muniz
Página: 3
Protegendo Formulários Web de Robôs
•
Proteger contra ataques de dicionário em serviços de autenticação.
•
Proteger serviços de e-mail contra Worms e Spam.
Os testes CAPTCHAs convencionais, baseados em textos distorcidos, podem ser facilmente
quebrados, como mostrado por Jeff Yan e Ahmad Salah El (2008).
3. reCAPTCHA
Segundo L. von Ahn, B. Maurer, C. McMillen, D. Abraham e M. Blum (2008), o
reCAPTCHA amplia o uso do esforço mental humano para resolver seus CAPTCHAs dando
às pessoas desafios CAPTCHAs com palavras extraídas de trechos de livros antigos,
publicados na maioria das vezes muito antes do surgimento dos computadores, palavras estas
que os computadores não conseguem identificar durante o processo de digitalização
automática desses livros. Com o reCAPTCHA está sendo possível, além da geração de
desafios para distinção de humanos de robôs, a digitalização em massa de livros antigos
(exemplo disto é o projeto Google Books) ajudando a preservar o conhecimento humano e
tornando a informação mais acessível ao mundo. As páginas são copiadas e as imagens
bitmaps resultantes são transformadas em arquivos de texto pelo processo de reconhecimento
ótico de caractere (OCR). Luis von Ahn, Benjamin Maurer, Colin McMillen, David Abraham
e Manuel Blum, afirmam que em impressões mais antigas, com tinta borrada e páginas
amareladas, um OCR não consegue reconhecer cerca de 20% das palavras, enquanto
humanos conseguem 99% de precisão no reconhecimento das mesmas palavras.
As soluções humanas apresentadas pelo reCAPTCHA são usadas na melhoria do processo de
digitalização de impressos antigos, como mostram os pesquisadores Luis von Ahn, Benjamin
Maurer, Colin McMillen, David Abraham e Manuel Blum (2008):
Nosso método, chamado de reCAPTCHA, é usado por mais de 40.000 sites e demonstra que
materiais impressos antigos podem ser transcritos, palavra por palavra, por ter pessoas
resolvendo CAPTCHAs em toda World Wide Web [...] As soluções inscritas pelos seres
humanos são usadas para melhorar o processo de digitalização. Para aumentar a eficiência e
segurança, apenas as palavras que os programas de OCR não conseguem reconhecer, são
mandas para os humanos.
Para atingir o objetivo de um CAPTCHA, além de diferenciar humanos de computadores,
também é necessário validar a resposta. Para fazer isso, o reCAPTCHA aplica duas palavras
Marcos de Paula Muniz
Página: 4
Protegendo Formulários Web de Robôs
em seu teste, uma desconhecia, extraída de um texto em que o OCR não conseguiu decifrar, e
uma palavra de controle já conhecida, para determinar se o CAPTCHA foi respondido
corretamente, como mostrado na Figura 1. Se fossem utilizadas apenas as palavras
desconhecidas extraídas de textos, seria impossível o reCAPTCHA determinar se a digitação
foi realizada por um humano ou um computador. Por outro lado, o fato de apenas uma das
duas palavras ter que ser digitada corretamente é uma fraqueza do reCAPTCHA.
Fig. 1. O sistema reCAPTCHA mostra palavras de textos escaneados para os humanos na World Wide Web.
Para gerar as imagens do reCAPTCHA, uma página de um livro é escaneada e analisada por
dois softwares de OCR diferentes, o resultado destas analises é então comparado por um
algoritmo um com o outro e depois a um dicionário da língua inglesa. Cada palavra decifrada
de forma diferente pelos dois softwares de OCR, ou que não forem encontradas no dicionário,
são marcadas como suspeitas. Cada palavra marcada como suspeita é então coloca em uma
imagem com outra palavra já conhecida. As duas palavras são distorcidas para garantir que
nenhum software de OCR seja capaz de decifrá-las.
A principal vantagem do reCAPTCHA é que como ele é gerado a partir de palavras
escaneadas de livros que softwares de OCR não conseguem decifrar, os algoritmos de quebra
de CAPTCHA atuais falham em 100% das vezes que tentam quebrá-lo, como afirmam L. von
Marcos de Paula Muniz
Página: 5
Protegendo Formulários Web de Robôs
Ahn, B. Maurer, C. McMillen, D. Abraham e M. Blum em seu artigo Human-Based
Character Recognition via Web Security Measures (2008).
4. Atacando um Formulário Desprotegido
Para demonstrar como um formulário desprotegido pode ser facilmente atacado, iremos
utilizar uma técnica de ataque chamada Spoofing HTTP Resquests (Falsificação de
Requisições HTTP).
Para
demonstrar
o
ataque,
considere
o
formulário
hospedado
em
http://msoftware.com.br/captcha/noticia.php, contendo o conteúdo mostrado a seguir. Este
formulário aparece no navegador de Internet (browser) como mostrado na Figura 2.
<form action="envia_comentario.php" method="POST">
<p>Nome:<br /><input type="text" name="nome" ></p>
<p>Comentário:<br /><textarea name="comentario" cols="40" rows="10" ></textarea></p>
<input type="submit" value="Enviar" />
</form>
Fig. 2. Formulário desprotegido.
Marcos de Paula Muniz
Página: 6
Protegendo Formulários Web de Robôs
Se um usuário preencher o formulário colocando no nome o valor João, no comentário o valor
“Parabéns pela notícia.” e em seguida clicar no botão Enviar, o browser enviará a seguinte
requisição HTTP ao servidor:
POST /captcha/envia_comentario.php HTTP/1.1
Host: msoftware.com.br
User-Agent: Mozilla/5.0 (Windows NT 6.1)
Referer: http://msoftware.com.br/captcha/noticia.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
nome=João&comentario=Parabéns pela notícia.
Ao modificar uma requisição HTTP um atacante passa a ter controle total sobre seu conteúdo,
podendo facilmente se passar por um usuário real. Este é o principal motivo de não poder
confiar cegamente nos dados enviados para formulários Web.
Um atacante pode forjar uma requisição HTTP de forma muito simples, criando uma conexão
telnet com o servidor remoto de destino na porta 80. Veja abaixo o exemplo de como uma
requisição HTTP manual, realizada através de uma conexão telnet com o servidor remoto
http://msoftware.com.br na porta 80, pode explorar facilmente a fragilidade do formulário do
exemplo mostrado acima:
$ telnet msoftware.com.br 80
Trying 187.45.193.169...
Connected to msoftware.com.br (187.45.193.169).
Escape character is '^]'.
POST /captcha/envia_comentario.php HTTP/1.1
Host: msoftware.com.br
User-Agent: Mozilla/5.0 (Windows NT 6.1)
Referer: http://msoftware.com.br/captcha/noticia.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 89
Marcos de Paula Muniz
Página: 7
Protegendo Formulários Web de Robôs
nome=Google Inc&comentario=Anúncie agora mesmo no <a href="http://bing.com">bing.com</a>.
A requisição HTTP será enviada ao servidor ao inserir duas quebras de linhas (pressionar
enter duas vezes), porque isto é o que indica o fim da requisição. Se tudo correr bem, o
servidor remoto retornará o seguinte:
HTTP/1.1 200 OK
Date: Sun, 29 May 2011 19:10:12 GMT
Server: Apache
Content-Length: 0
Connection: close
Content-Type: text/html
Connection closed by foreign host.
A tela do atacante ficará como mostrada na Figura 3. A página do formulário ficará como
mostrada na Figura 4.
Fig. 3. Tela do atacante após ataque bem sucedido ao formulário utilizado como exemplo.
Marcos de Paula Muniz
Página: 8
Protegendo Formulários Web de Robôs
Fig. 4. Página do formulário após ataque bem sucedido.
Chris Shiflett (2005), afirma que existem inúmeras outras formas de enviar informações
diretamente para servidores Web remotos e que uma maneira mais prática de fazer isto é
automatizar a requisição HTTP utilizando PHP para enviar centenas ou até milhares de
requisições automaticamente. O fato é que como as requisições podem ser facilmente
manipuladas, e as validações de dados não são suficientes para barrar este tipo de ataque, a
melhor maneira de proteger os formulários Web é, além das validações triviais de dados,
utilizarem também um CAPTCHA.
5. Ataques Contra CAPTCHAs Convencionais
Para demonstrarmos como um CAPTCHA convencional pode ser quebrado utilizando um
software de OCR, utilizamos o OCRopus para Linux, disponível para download no endereço
http://code.google.com/p/ocropus/. O OCRopus é um software que foi desenvolvido com o
objetivo principal de digitalizar livros. Nosso objetivo ao utilizar o OCRopus nesta
Marcos de Paula Muniz
Página: 9
Protegendo Formulários Web de Robôs
demonstração é comprovarmos que alguns tipos de CAPTCHAs convencionais estão sujeitos
a quebra por um simples software de OCR.
Utilizamos três imagens de CAPTCHAs obtidas aleatoriamente na Internet. A Figura 5 é um
tipo de CAPTCHA muito utilizado em serviços de Hotspot (serviço de acesso à Internet
oferecido em um determinado local, geralmente público, através de rede sem fio), a Figura 8 é
um tipo de CAPTCHA muito utilizado em blogs e fóruns na Internet e a Figura 10 apresenta o
CAPTCHA utilizado pelo Gmail.
Fig. 5. hotspot-captcha.png
A Figura 6 mostra a utilização do OCRopus na tentativa de quebra do CAPTCHA da Figura 5,
gerando o resultado no arquivo teste1.html.
Fig. 6. Tentativa de quebra do CAPTCHA da Figura 5 utilizando OCRopus.
A Figura 7 mostra o conteúdo do arquivo teste1.html, que é o resultado da execução do
OCRopus na tentativa de quebra da Figura 5. O OCR identificou corretamente o texto do
CAPTCHA.
Marcos de Paula Muniz
Página: 10
Protegendo Formulários Web de Robôs
Fig. 7. Resultado da digitalização do CAPTCHA da Figura 5 com OCRopus.
Fig. 8. Internet-captcha.jpg
A Figura 9 mostra o resultado da execução do OCRopus na tentativa de quebra do
CAPTCHA da Figura 8. Neste caso, o OCR reconheceu todas as letras do CAPTCHA, mas
inseriu um espaço entre a segunda e terceira letra que pode ser ignorado automaticamente por
um bot, já que os CAPTCHAs convencionais não utilizam espaços em seus testes.
Fig. 9. Resultado da digitalização do CAPTCHA da Figura 8 com OCRopus.
Fig. 10. Google-captcha.jpg
Marcos de Paula Muniz
Página: 11
Protegendo Formulários Web de Robôs
A Figura 11 mostra o resultado da execução do OCRopus na tentativa de quebra do
CAPTCHA da Figura 10. Note que neste caso, o OCR falhou.
Fig. 11. Resultado da digitalização do CAPTCHA da Figura 10 com OCRopus.
Como podemos ver, o OCRopus obteve 100% de sucesso no reconhecimento das Figuras 5 e
8, que apresentam um tipo de CAPTCHA convencional com pouca distorção, já no
CAPTCHA da Figura 10, que possui distorções, fonte e distância entre as letras mais bem
trabalhadas, o OCRopus não conseguiu reconhecer nenhuma letra.
O OCRopus pode ser estendido pelo C++, como afirma o Web site que o disponibiliza para
download, o que possibilita o desenvolvimento de um script que automatize o processo de
quebra de CAPTCHAs convencionais que são sujeitos a ataques de OCR, como os utilizados
nas Figuras 5 e 8.
6. Ataques Contra o reCAPTCHA
Ataques de OCR no reCAPTCHA são inúteis, como mostrado no Web site do projeto de
mesmo nome, pois os testes do reCAPTCHA são gerados para serem resistentes a este tipo de
ataque. Abaixo mostramos que esta afirmação é verdadeira submetendo a imagem da Figura
12 de um teste reCAPTCHA ao OCRopus.
Marcos de Paula Muniz
Página: 12
Protegendo Formulários Web de Robôs
Fig. 12. Imagem de um teste reCAPTCHA
A Figura 13 mostra a utilização do OCRopus na tentativa de quebra do reCAPTCHA da
Figura 12, gerando o resultado no arquivo teste4.html.
Fig. 13. Tentativa de quebra do reCAPTCHA da Figura 12 utilizando OCRopus.
A Figura 14 mostra o resultado da execução do OCRopus na tentativa de quebra do
reCAPTCHA da Figura 12. Note que neste caso, o OCR também falhou.
Fig. 14. Resultado da digitalização do reCAPTCHA da Figura 12 com OCRopus.
L. von Ahn, B. Maurer, C. McMillen, D. Abraham e M. Blum afirmam em seu artigo
“Human-Based Character Recognition via Web Security Measures” (2008), que como o
reCAPTCHA é gerado a partir de palavras escaneadas de livros que softwares de OCR não
Marcos de Paula Muniz
Página: 13
Protegendo Formulários Web de Robôs
conseguem decifrar, os algoritmos de quebra de CAPTCHA atuais falham em 100% das vezes
que tentam quebrá-lo.
Porém, Jonathan Wilkins (2009), afirma ter obtido uma taxa de sucesso de 5% em um ataque
realizado a 200 variações do reCAPTCHA, mesclando técnicas de fragmentação e
segmentação de palavras, ataques de OCR e de dicionários. Ainda segundo ele, as duas
maiores fraquezas do sistema reCAPTCHA são a não obrigatoriedade da digitação correta das
duas palavras do teste CAPTCHA, apenas a palavra de controle deve ser digitada
corretamente, e a utilização de textos em inglês, o que viabiliza a validação e classificação dos
resultados obtidos pelos softwares de OCR em dicionários da língua inglesa.
Certamente podemos esperar melhorais no reCAPTCHA nos próximos anos. Uma melhoria
que recomendamos é a obrigatoriedade de se digitar corretamente as duas palavras. A palavra
não identificada nas digitalizações de livros antigos deve passar por uma análise humana. O
reCAPTCHA deve de alguma forma armazenar o resultado desta análise para posterior
comparação com o texto digitado pelo usuário e assim garantir a obrigatoriedade da digitação
das duas palavras corretamente reconhecidas por seres humanos e não pelos OCR. Neste
momento, ele ainda é uma boa forma de proteger formulários eletrônicos de robôs na Internet.
7. Obtendo e Utilizando o reCAPTCHA
Para
utilizar
o
reCAPTCHA
é
necessário
acessar
o
site
do
projeto
em
http://www.google.com/recaptcha clicar no link “GET reCAPTCHA” e efetuar login com um
e-mail que seja conta Google. Feito isso, será necessário cadastrar o domínio onde deseja
utilizar o reCAPTCHA e clicar no botão “Create Key”. Pronto, agora você receberá um par
de chaves pública e privada para utilizar o reCAPTCHA no domínio cadastrado. Se você
desejar utilizar o mesmo par de chaves em vários domínios, você deve selecionar a caixa
“Enable this key on all domains (global key)” na hora de cadastrar o domínio.
Para instalar o reCAPTCHA no Web site, será necessário fazer download da biblioteca do
reCAPTCHA, vamos mostrar abaixo como utilizar o reCAPTCHA no PHP.
Marcos de Paula Muniz
Página: 14
Protegendo Formulários Web de Robôs
Faça
download
da
biblioteca
recaptchalib.php
que
se
encontra
http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest,
no
endereço
depois
basta
adicionar o seguinte código no formulário:
require_once('recaptchalib.php');
$publickey = "sua_chave_pública";
echo recaptcha_get_html($publickey);
Para validar se o reCAPTCHA foi digitado corretamente, adicione a seguinte validação no
arquivo alvo (target) do formulário:
<?php
require_once('recaptchalib.php');
$privatekey = "sua_chave_privada";
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
// O que acontece quando o CAPTCHA for digitado incorretamente.
die ("O reCAPTCHA foi digitado incorretamente! Tente novamente. Erro: " . $resp->error );
} else {
// Código a ser executado quando o CAPTCHA for digitado corretamente.
}
?>
Feito isto, o reCAPTCHA estará funcionando corretamente em seu Web site.
8. Conclusões
Neste artigo vimos que o reCAPTCHA é um bom mecanismo de proteção para formulários
Web, que além de barrar os spammers ainda contribui com a digitalização de livros antigos.
Mostramos como é fácil para um atacante gerar entradas maliciosas para inputs em
formulários Web através do ataque de Spoofing HTTP Resquests.
Ficou claro para nós que a utilização de um CAPTCHA como proteção para um formulário
fortalece o mesmo contra os ataques do tipo Spoofing HTTP Resquests, já que ao utilizar um
Marcos de Paula Muniz
Página: 15
Protegendo Formulários Web de Robôs
CAPTCHA, os dados enviados pelo formulário só serão considerados válidos caso o
CAPTCHA seja respondido corretamente.
O artigo mostrou também que apesar das fraquezas identificadas no reCAPTCHA, os ataques
atuais não conseguem passar de 5% de sucesso. Assim podemos dizer que a tecnologia
utilizada pelo reCAPTCHA para geração de suas imagens CAPTCHAs inviabilizam a maioria
dos bots de preenchimento automático de formulário. Ao gerar apenas testes CAPTCHAs que
programas de OCR sozinhos não consigam resolver, tornando os formulários mais seguros
contra ataques automáticos.
Acreditamos que o objetivo principal deste trabalho foi atingido, apresentar o reCAPTCHA
como solução de segurança recomendada para proteção de formulários Web contra ataques
de preenchimento automático.
Marcos de Paula Muniz
Página: 16
Protegendo Formulários Web de Robôs
9. Referências
1 Alan M. Turing. Computing Machinery and Intelligence. In: Mind, V59, No236, p.
433-460, 1950.
2 J. Langford, L. von Ahn, M. Blum and N. Hopper. The CAPTCHA Project.
http://www.captcha.net
3 J. Langford, L. von Ahn and M. Blum: Telling Humans and Computer Apart Automatically,
CACM, V47, No2, 2004.
4 J. Yan and A. S. El Ahmad. A Low-cost Attack on a Microsoft CAPTCHA: School of
Computing Science Technical Report, Newcastle University, England, 2008.
5 L. von Ahn, B. Maurer, C. McMillen, D. Abraham and M. Blum: Human-Based Character
Recognition via Web Security Measures: Science, V.321, 2008. <Disponível em:
http://www.google.com/recaptcha/static/reCAPTCHA_Science.pdf>.
6 LUSTOSA,
Bruno:
Segurança
ao
enviar
email.
<Disponível
http://www.revistaphp.com.br/artigo.php?id=66>. Acesso me 12/06/2011.
em:
7 Monica Chew, J. D. Tygar: Image Recognition CAPTCHAs: International Information
Security Conference, 2004.
8 MOREIRA, Márcio: MINIMIZANDO OS SPAMS COM O USO DE E-MAILS
SEGUROS: Faculdade de Ciências Aplicadas de Minas Gerais da União
Educacional Minas Gerais, Uniminas, Brasil, 2007.
9 SHIFLETT, Chris: Essential PHP Security: O’Reilly Media, 2005.
10 WILKINS, Jonathan: Strong CAPTCHA Guidelines
http://bitland.net/captcha.pdf>. Acesso em 28/06/2011.
Marcos de Paula Muniz
v1.2.
<Disponível
Página: 17
em:
Download

Protegendo Formulários Web de Robôs