quinta-feira, 25 de fevereiro de 2010

Validando Formulários com Captcha - sistema anti-spam

Codigos Captcha são uma tecnica de proteção anti-span existente em varios sites da internet e até hoje é o método mais eficiente.

 
exemplo de códigos captcha

A técnica altamente difundida consiste em gerar uma imagem aleatória (não são caracteres digitados, sim uma imagem), com letras e/ou números e distorce-los.

Mas para que?

Ao vizualizarmos um código captcha facilmente (ou nem sempre tão facilmente) conseguimos definir o que está escrito, o que não acontece com um computador, um software não tem a capacidade de olhar e identificar a letra visualmente pois a mesma trata-se de uma imagem e não um texto digitado com caracteres.

O Captcha é totalmente seguro?

Como qualquer sistema de segurança existem modos de burla-lo, alguns hackers conseguem criar ferramentas capazes de ver e identifica o código Captcha - leia mais aqui

O que na verdade ainda não é tão facil o que ainda torna o Captcha um sistema muito confiável.


Vamos deixar de papo furado e começar logo.


Irei explicar neste tutorial um método interessante de criar um codigo captcha, pois devemos atentar-nos aos seguintes tópicos.

  1. Não pode haver em hipótese nenhuma o valor do código em algum lugar do código fonte do site, pois o mesmo facilmente será identificado.
  2. Não podemos utilizar imagens que levem o nome de seus respectivos números ou letras.
  3. Devemos ter um fundo com traços ou cores para confundir um software
Vamos começar a programar.


O código abaixo tem como função gerar uma imagem captcha com varios caracteres, o melhor tudo é feito na programação não há nenhuma imagem salva.

Preste atenção nos comentários eles irão te ajudar

img.asp

   <%

   'Função para gerar as letras

   Function Gerar_letras(quantidade)

   'Declaramos o Array que armazenará o total de caractéres utilizados, letras, números, sinais, etc.

   'No nosso caso, 61 sendo, 26 letras maiúsculas, 26 minúsculas e 10 números (0 - 9)

   Dim Senha(61)

   'Declaramos os arrays usados e seus valores

   Senha(0) = "a"

   Senha(1) = "b"

   Senha(2) = "c"

   Senha(3) = "d"

   Senha(4) = "e"

   Senha(5) = "f"

   Senha(6) = "g"

   Senha(7) = "h"

   Senha(8) = "i"

   Senha(9) = "j"

   Senha(10) = "k"

   Senha(11) = "l"

   Senha(12) = "m"

   Senha(13) = "n"

   Senha(14) = "o"

   Senha(15) = "p"

   Senha(16) = "q"

   Senha(17) = "r"

   Senha(18) = "s"

   Senha(19) = "t"

   Senha(20) = "u"

   Senha(21) = "v"

   Senha(22) = "w"

   Senha(23) = "x"

   Senha(24) = "y"

   Senha(25) = "z"

   Senha(26) = "0"

   Senha(27) = "1"

   Senha(28) = "2"

   Senha(29) = "3"

   Senha(30) = "4"

   Senha(31) = "5"

   Senha(32) = "6"

   Senha(33) = "7"

   Senha(34) = "8"

   Senha(35) = "9"

   Senha(36) = "A"

   Senha(37) = "B"

   Senha(38) = "C"

   Senha(39) = "D"

   Senha(40) = "E"

   Senha(41) = "F"

   Senha(42) = "G"

   Senha(43) = "H"

   Senha(44) = "I"

   Senha(45) = "J"

   Senha(46) = "K"

   Senha(47) = "L"

   Senha(48) = "M"

   Senha(49) = "N"

   Senha(50) = "O"

   Senha(51) = "P"

   Senha(52) = "Q"

   Senha(53) = "R"

   Senha(54) = "S"

   Senha(55) = "T"

   Senha(56) = "U"

   Senha(57) = "V"

   Senha(58) = "W"

   Senha(59) = "X"

   Senha(60) = "Y"

   Senha(61) = "Z"

   Randomize

   'Contamos a quantidade de letras geradas

   do while len(chave) < quantidade

   num = Senha(Int(61 * Rnd ))

   chave = chave + num

   loop

   Gerar_letras = chave

   end function

   'Aqui chamamos a função e armazenamos o resultado da mesma em uma sessão.

   'Troque o 6 pela quantidade de caracteres que deseja sortear.

   Session("Senha") = Gerar_letras(6)

   'Cria o objeto Jpeg

   Set Jpeg = Server.CreateObject("Persits.Jpeg")

   'Imagem usada como fundo no caso mandei um JPG qualquer com o nome de imagem

   Path = Server.MapPath("imagem.jpg")

   'Abre a imagem existente

   Jpeg.Open Path

   'Salva a imagem. Aqui foi usada a pasta teste, que obrigatoriamente deve ter permissão de escrita.

   'Altere-a pela pasta onde será salva a imagem.

   'LEMBRE-SE A PASTA DEVERÁ TER PERMISSÃO DE ESCRITA

   Jpeg.Save Server.MapPath("captcha.jpg")

   'Define altura e largura da imagem.

   Jpeg.Width = 200

   Jpeg.Height = 40

   'Define cor, fonte, tamanho e tipo de qualidade do texto

   Jpeg.Canvas.Font.Color = &H800000

   Jpeg.Canvas.Font.Family = "Verdana"

   Jpeg.Canvas.Font.Size = "36"

   Jpeg.Canvas.Font.Bold = True

   Jpeg.Canvas.Font.Quality = 4

   'Desenha as bordas da imagem.

   Jpeg.Canvas.Pen.Color = &H800000

   Jpeg.Canvas.Pen.Width = 1

   Jpeg.Canvas.Brush.Solid = False

   Jpeg.Canvas.DrawBar 1, 1, Jpeg.Width, Jpeg.Height

   Jpeg.Canvas.PrintText 30, 0, "" & Session("Senha") & ""

   'Envia a imagem para o navegador.

   Jpeg.SendBinary

   'Remove a instância do objeto da memória

   Set Jpeg = Nothing

   %>


OBS: O script acima irá gerar uma imagem (binários), portanto não pode conter código HTML junto.
Agora vamos ver como fica o formulário que vai exibir a imagem gerada no script anterior e autenticar os caracteres, vamos chamálo de validar.asp


validar.asp 



<%
' Verifica se o valor digitado no campo do formulário é o mesmo que gerou a imagem no script img.asp
if request.ServerVariables("REQUEST_METHOD") = "POST" then
  if Request.Form("txt_key") = Session("Senha") then
    Response.Write "Formulário confirmado!"
  else
    Response.Write "Preencha o campo com os caracteres da imagem!"
  end if
end if
%>

<form action="" method="post" name="form1">

<input id="txt_key" name="txt_key" size="10" type="text" />
<input name="Submit" type="submit" value="Enviar" />


  <img src="img.asp" /></form>

Valeu galera espero que vcs curtam


Nenhum comentário: