CAPTCHA é um acrônimo da expressão “Completely Automated Public Turing test to tell Computers and Humans Apart” (Teste de Turing Público Completamente Automatizado para Diferenciação entre Computadores e Humanos)
Provavelmente você já solucionou um algum dia. =D
Simplificadamente é uma técnica para distinguir se o usuário é um sistema ou um humano.
Exemplo, existem sistemas “robo” que podem fazer diversas tentativas a uma área protegida por usuário e senha por exemplo. Como impedir que isso aconteça? Você pode utilizar a técnica CAPTCHA, que é uma imagem com caracteres que deve ser interpretado e informado para que o sistema valide e conceda o acesso. Isso dificulta que um robô prossiga pelo fato de ter de interpretar o texto descrito na imagem. No Facebook por exemplo, tente acessar diversas vezes com uma senha errada. Ele irá te apresentar um CAPTCHA que interpretado corretamente dará o acesso a rede social.
Porém existem sistemas capazes de interpretar o CAPTCHA, é por isso que existem variações de CAPTCHA distorcidos, com diversos traços espalhados, tudo isso para dificultar que um robô interprete o CAPTCHA.
Segundo a Google – “Cerca de 200 milhões CAPTCHAs são solucionados por seres humanos em todo o mundo a cada dia. Em cada caso, cerca de dez segundos de tempo humano estão sendo gastos. Individualmente, isso não é muito tempo, mas em conjunto estes enigmas consumir pouco mais de 150.000 horas a cada dia.”
Neste tutorial vamos desenvolver o código em um controle ascx para gerar um CAPTCHA.
Vamos trabalhar com método Random(para gerar o texto aleatório), e com a classe Draw(para desenhar nosso texto na imagem).
Estarei utilizando neste tutorial as seguintes ferramentas:
-IDE VisualStudio 2010
-Framework .Net 4.0
-Asp.Net e C#
Vamos codificar?
Crie um projeto WebForm, nele adicionei uma pasta chamada Controle. Nesta pasta adicione um Web Control. Vaje a Figura 1.
Figura 1 – Adicionando um Web User Control
Ok, agora adicione no projeto uma pasta chamada Imagem. Nesta pasta adicione alguma imagem que servira de fundo para o captcha.
A estrutura do projeto deve ficar similar a Figura 2
Figura 2 – Estrutura do projeto
Agora que já montamos nossa estrutura, vamos codificar.
O código principal esta dentro do arquivo ctrCaptcha.ascx.cs. E somente fazemos uma referência desse controle em nossa página Default.aspx
Veja na Listagem 1 o código do controle ctrCaptcha.ascx.cs.
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
namespace Captcha.Controle
{
public partial class ctrCaptcha : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
//Pega valor do método que retorna um valor aleatório
//e armazena na variavel.
string valorCaptcha = RetornaValorCaptcha(5);
//Armazena o valor em uma Session.
Session["ValorCaptcha"] = valorCaptcha;
//Método que cria a imagem com o texto.
CriaCaptcha(valorCaptcha);
}
private string RetornaValorCaptcha(int quantidadeCaracteres)
{
string valorCaptcha = string.Empty;
//Todos os itens que poderão aparecer escritos na imagem
char[] caracteres = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
int numRamdom;
Random random = new Random();
//Passa pelo loop for e vai armazenando os caracteres sorteados.
for (int i = 0; i < quantidadeCaracteres; i++)
{
numRamdom = random.Next(0, 62);
valorCaptcha += caracteres[numRamdom];
}
return valorCaptcha;
}
private void CriaCaptcha(string valorCaptcha)
{
//Pega a imagem de fundo de acrodo com o caminho indicado.
System.Drawing.Image imagemFundo = System.Drawing.Image.FromFile(Server.MapPath("imagem/imgCaptcha.jpg"));
//Define o tamanho(largura x altura) da imagem.
Size tamanhoImagem = new Size(160, 50);
//Cria imagem do tipo BitMap com a imagem e o tamanho definidos anteriormente
Bitmap objBitMap = new Bitmap(imagemFundo, tamanhoImagem);
using (Graphics grafico = Graphics.FromImage(objBitMap))
{
//Fonte do texto
Font fonte = new Font("Currier New", 30, FontStyle.Bold);
//Posição do texto na imagem
PointF posicao = new PointF(4.0F, 4.0F);
//Escreve o texto na imagem.
//Definimos o texto, o tamanho da fonte a cor da letra e a posição das letras na imagem.
grafico.DrawString(valorCaptcha, fonte, Brushes.White, posicao);
//Istancia objetos do tipo Pen com a cor e a largura que sera desenhado na tela
//estamos utilizando para
Pen CanetaVermelha = new Pen(Color.Red, 2);
//Define pontos da linha
Point point1 = new Point(5, 20);
Point point2 = new Point(40, 25);
Point point3 = new Point(190, 5);
Point point4 = new Point(80, 60);
Point[] curvePoints = { point1, point2, point3, point4 };
//Cria linha na imagem
grafico.DrawCurve(CanetaVermelha, curvePoints);
}
Response.ContentType = "image/GIF";
objBitMap.Save(Response.OutputStream, ImageFormat.Gif);
}
}
}
Listagem 1 – Código do arquivo ctrCaptcha.ascx.cs
Estando pronto o código do nosso controle, vamos adiciona-lo em nossa página. Veja na Listagem 2 como deve ficar o código da página Default.aspx.
<!-- Declara o nome utilizado para o controle e a localização do controle no projeto. --></pre> <form id="form1"> <div></div> </form> <pre>
Listagem 2 – Adicionando o controle na página.
Pronto, de um Build e execute sua aplicação!
Veja como ficou o resultado na Figura 3.
Figura 3 – Resultado Captcha.
Curiosidades
(http://pt.wikipedia.org/wiki/Captcha)
“A primeira discussão acerca dos testes automatizados que distinguem seres humanos dos computadores com objetivo de controlar o acesso aos serviços da web aparece em um manuscrito 1996 de Moni Naor do instituto de Weizmann de ciência, intitulado “Verification of a human in the loop, or Identification via the Turing Test” (verificação de um ser humano no laço, ou identificação através do teste de Turing).
CAPTCHAs primitivos parecem ter sido desenvolvido mais tarde, em 1997, para o site de procura AltaVista por Andrei Broder e seus colegas para impedir que os bots adicionassemURLs a sua Ferramenta de Busca. Procurando uma maneira fazer suas imagens resistentes ao ataque do OCR, Optical Character Recognition (Reconhecimento Óptico de Caracteres), a equipe olhou o manual de scanner, obtendo recomendações para melhorar os resultados do OCR (typefaces similares, fundos lisos, etc.). A equipe criou enigmas tentando simular o que o manual reivindicado causaria a OCR mau. Em 2000, von Ahn e Blum desenvolveram e publicaram a noção de um CAPTCHA, que incluísse todo o programa que puder distinguir seres humanos dos computadores. Inventaram exemplos múltiplos, incluindo o primeiro CAPTCHAs a ser usado extensamente no Yahoo.”
É isso ai! Bons Estudos!
Fiquem a vontade para dúvidas, críticas e sugestões!







