WPF - Criando e usando CAPTCHA


Um CAPTCHA apresenta caracteres tão distorcidos que quase nenhum programa seria capaz de interpretá-los e decifrá-los de maneira automática. Teoricamente, só mesmo um humano conseguiria entendê-lo e digitar a seqüência correta, comprovando que é um humano e não um programa malicioso , spam, etc.

Veja a abaixo um trecho da definição da Wikipédia - http://pt.wikipedia.org/wiki/CAPTCHA

CAPTCHA é um acrônimo de -  Completely Automated Public Turing test to tell Computers and Humans Apart -  e envolve um computador (um servidor) que pede que um usuário termine um teste. Como os computadores são incapazes de resolver o CAPTCHA, todo usuário que incorpora uma solução correta é presumidamente humano. O termo foi inventado em 2000 por Luis von Ahn, Manuel Blum , Nicholas J. Hopper e por John Langford.

Um tipo comum de CAPTCHA requer que o usuário identifique as letras de uma imagem distorcida, às vezes com a adição de uma seqüência obscurecida das letras ou dos dígitos que apareça na tela. Como o teste é administrado por um computador, em contraste ao teste padrão de Turing que é administrado por um ser humano, é descrito às vezes como um "teste reverso de Turing".

O CAPTCHA é usado para evitar ataques de robos ou bots (o termo bots vem de robots, robôs em inglês), programinhas maliciosos que automatizam operações repetitivas. Sem os captchas, esses bots seriam capazes de simular um humano digitando informações aleatórias de modo a criar centenas ou até milhares de  requisições em poucas horas.

Neste artigo vamos criar o CAPTCHA em uma aplicação WPF usando a linguagem C# e XAML e o Visual Studio 2012 Express for desktop.

Abra o VS 2012 Express for desktop e clique em New Project e selecione o template WPF Application informando o nome WPF_Captcha e clique no botão OK;

A seguir no arquivo MainWindow.xaml vamos incluir a partir da ToolBoox dois controles TextBox e um controle Button configurando suas propriedades conforme o leiaute e código mostrado a seguir:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF - Captcha Simples" Height="350" Width="525" Loaded="Window_Loaded_1" WindowStartupLocation="CenterScreen" Background="{x:Null}" >
    <Grid>
        <TextBox x:Name="txtCaptcha" HorizontalAlignment="Left" Height="66" Margin="153,79,0,0" TextWrapping="Wrap" Text="TextBox" 
VerticalAlignment="Top"  Width="221" Background="Yellow" Foreground="Red" FontStyle="Italic" IsReadOnly="True" FontWeight="Heavy" 
FontSize="38" FontStretch="UltraCondensed"/>
        <Button x:Name="btnAcesso" Content="Acesso" HorizontalAlignment="Left" Margin="219,185,0,0" VerticalAlignment="Top" Width="101" 
Height="30" FontSize="14"/>
        <TextBox x:Name="txtAcesso" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="136" 
RenderTransformOrigin="2.108,7.043" Margin="200,157,0,0"/>
    </Grid>
</Window>

Agora no menu Project clique em Add New Item e selecione o template Window(WPF) informando o nome Menu.xaml:

Inclua a partir da ToolBox um controle TextBox conforme mostra o leiaute e o código a seguir:

Nesta janela WPF iremos apenas exibir uma mensagem ao usuário que conseguir vencer o desafio captcha.

Agora volte ao arquivo MainWindow.xaml e no evento Click do botão de comando vamos definir o código que verifica se o usuário acertou o captcha.

Private Sub btnAcesso_Click(sender As Object, e As RoutedEventArgs) Handles btnAcesso.Click
        If txtCaptcha.Text.Trim() = txtAcesso.Text.Trim() Then
            MessageBox.Show(" Bem-Vindo !! Acesso concedido ...")
            Dim mnu As New Menu
            Me.Hide()
            mnu.Show()
        Else
            MessageBox.Show(" Acesso negado...  tente outra vez...")
            txtAcesso.Clear()
            txtAcesso.Focus()
            GeraCaptcha()
        End If
    End Sub

Se o usuário errou o captcha será exibida uma mensagem de alerta, a caixa de texto será limpa e receberá o foco e um novo CAPTCHA será gerado.

Se o usuário acertou o captcha então vamos exibir uma mensagem, esconder a janela atual e abrir a janela Menu.xaml exibindo a mensagem de boas vindas.

Para exibir o captcha na abertura da aplicação vamos usar evento Loaded para chamar a rotina GeraCaptcha() e colocar o foco na caixa de texto :

 Private Sub Window_Loaded_1(sender As Object, e As RoutedEventArgs)
        GeraCaptcha()
        txtAcesso.Focus()
    End Sub

A rotina GeraCaptcha que gera o captcha, na verdade uma sequência de caracteres, é visto abaixo:

Private Sub GeraCaptcha()
        Try
            Dim caracteresCaptcha As String = " "
            caracteresCaptcha = "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"
            caracteresCaptcha += "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,y,z"
            caracteresCaptcha += "1,2,3,4,5,6,7,8,9,0"
            caracteresCaptcha += "@,#,$,&"
            Dim a As Char() = {","c}
            Dim ar As String() = caracteresCaptcha.Split(a)
            Dim senha As String = " "
            Dim temp As String = " "
            Dim r As New Random()
            For i As Integer = 0 To 5
                temp = ar((r.Next(0, ar.Length)))
                senha += temp
            Next
            txtCaptcha.Text = senha
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

Agora executando o projeto teremos o seguinte resultado:

1- Desafio captcha aceito e confirmado

2- Desafio captcha : o usuário falhou

A esta altura você deve estar se perguntando: 'Mas por que eu teria que usar um CAPTCHA em uma aplicação desktop WPF ? "

Na verdade a utilidade é quase nula, a não ser que em um ambiente de rede interna exista algum cenário na qual o CAPTCHA poderia ser usado.

Meu objetivo não foi bem mostrar como usar CAPTCHA com Wpf mas mostrar como gerar um sequência de caracteres aleatórios e como abrir uma janela xaml.

Pegue o projeto completo aqui: Wpf_Captcha.zip

João 3:31 Aquele que vem de cima é sobre todos; aquele que vem da terra é da terra, e fala da terra. Aquele que vem do céu é sobre todos.

João 3:32 Aquilo que ele tem visto e ouvido, isso testifica; e ninguém aceita o seu testemunho.

João 3:33 Mas o que aceitar o seu testemunho, esse confirma que Deus é verdadeiro.

João 3:34 Pois aquele que Deus enviou fala as palavras de Deus; porque Deus não dá o Espírito por medida.

Referências:


José Carlos Macoratti