Ejemplo de Código de Validación BotDetect ASP.NET 2.0 CAPTCHA C#

Este ejemplo de validación de BotDetect ASP.NET CAPTCHA contiene el código básico requerido para agregar un control CAPTCHA a una página ASP.NET y validar la entrada de usuario. Puede ser usado como un punto de partida cuando recién comienza a aprender como usar BotDetect CAPTCHA, y es equivalente a que siguiera las instrucciones de Como usar BotDetect ASP.NET CAPTCHA en Visual Studio 2005.

Ubicación de los archivos del proyecto de ejemplo

Por defecto, este proyecto de ejemplo es instalado en
C:\Archivos de Programa\Lanapsoft\BotDetect\ASP.NET 2.0\v2.0\Samples\CSharpBotDetect2Demo\.

También puede correrlo desde el Menú de Inicio:
Programas > Lanapsoft > BotDetect > ASP.NET 2.0 > v2.0 > Samples > C# BotDetect Demo Preview.

Default.aspx

Listado del Código Fuente Completo

<%@ Page Language="C#" AutoEventWireup="true" 
  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register Assembly="Lanap.BotDetect" Namespace="Lanap.BotDetect" 
  TagPrefix="BotDetect" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>BotDetect Demo</title>
    <link type='text/css' rel='Stylesheet' href='StyleSheet.css' />
</head>
<body>
    <form id="form1" runat="server">
    <fieldset id="Preview">
        <legend>
            <span id="PreviewLegend">CAPTCHA Preview</span>
        </legend>
        <div id="PromptDiv">
            <span id="Prompt">Type the characters you see in 
              the picture</span>
        </div>
        <div id="CaptchaDiv">
            <BotDetect:Captcha ID="SampleCaptcha" runat="server" />
        </div>
        <div id="ValidationDiv">
            <asp:TextBox ID="CodeTextBox" runat="server">
            </asp:TextBox>
            <asp:Button ID="ValidateButton" runat="server" />
            <asp:Label ID="MessageCorrectLabel" runat="server">
            </asp:Label>
            <asp:Label ID="MessageIncorrectLabel" runat="server">
            </asp:Label>
        </div>
    </fieldset>
    <div id="Note">
        <span>NOTE: the Trial version will use "LANAP" instead of a 
          random code in 50% of renderings.</span>
    </div>
    </form>
</body>
</html>

Explicación

Las líneas requeridas para agregar el control de BotDetect CAPTCHA al formulario ASP.NET y validarlo usando postbacks parciales Ajax están marcadas con negritas. Para usar el control <BotDetect:Captcha>, primero debemos registrar el ensamble Lanap.BotDetect.dll usando la directiva <%@Register %>.

El formulario también contiene <asp:TextBox> para la entrada del usuario, un <asp:Button> para enviar la página, y un par de controles <asp:Label> que son utilizados para mostrar los resultados de la validación CAPTCHA.

El resto del archivo es generado por defecto por Visual Studio 2005 o, simplemente define el diseño y la presentación visual de la página.

Default.aspx.cs

Listado del Código Fuente Completo

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_PreRender(object sender, EventArgs e)
    {
        /// initial page setup
        if (!IsPostBack)
        {
            /// set control text
            ValidateButton.Text = "Validate";
            MessageCorrectLabel.Text = "Correct!";
            MessageIncorrectLabel.Text = "Incorrect!";

            /// these messages are shown only after validation
            MessageCorrectLabel.Visible = false;
            MessageIncorrectLabel.Visible = false;
        }

        CodeTextBox.Attributes.Add("onkeyup", 
            "this.value = this.value.toLowerCase();");

        if (IsPostBack)
        {
            /// validate the input code, and show the 
            /// appropriate message 
            string code = CodeTextBox.Text.Trim().ToUpper();
            if (SampleCaptcha.Validate(code))
            {
                MessageCorrectLabel.Visible = true;
                MessageIncorrectLabel.Visible = false;
            }
            else
            {
                MessageCorrectLabel.Visible = false;
                MessageIncorrectLabel.Visible = true;
            }

            /// clear previous user code input
            CodeTextBox.Text = null;
        }
    }
}

Explicación

El procesado del formulario es hecho en el manejador de eventos Page_PreRender, asi que todos los eventos de control individual son ejectudos antes de la validación CAPTCHA. Si quiere validar el CAPTCHA antes de los eventos de control individual, puede mover todo el código al manejador de eventos Page_Load.

También, el procesamiento no está hecho a propósito en el manejador ValidateButton_Click,en caso de que hayan múltiples controles que pueden enviar la página – queremos validar el CAPTCHA independientemente de lo que halla causado a la página enviarse. Sin mencionar que la mayoría de los robots no enviarán la página mediante un click en el botón, pero simplemente construyendo los datos requeridos del POST, lo que haya o no incluido la parte del "control que causó el postback", responsable por activar el evento del click de botón. Chequeando el CAPTCHA en cada carga de la página asegura la seguridad CAPTCHA como corresponde en todos los casos.

En la primera carga de (if (!IsPostBack)) de la página, los controles de botón y etiqueta son inicializados, y la validación CAPTCHA es pasada por alto, porque el usuario no tuvo la oportunidad de resolverlo todavía.

En cada carga de la página, agregamos un pequeño fragmento JavaScript manejador de eventos del cliente onkeyup al cuadro de texto, asi que la entrada del usuario es inmediatamente transformada a minúsculas durante el tipeo. Esto sirve para comunicar al usuario el hecho de que el códgio CAPTCHA no es sensible a las mayúsculas/minúsculas.

Cuando la página es enviada (if (IsPostBack)), enviamos la entrada de usuario al método Captcha.Validate(). En este ejemplo simple, usamos el resultado de la validación sólo para mostrar un mensaje, y siempre mostrar un nuevo CAPTCHA. En la mayoría de los casos de uso, mostrará un nuevo CAPTCHA sólo si el usuario no resolvió el anterior correctamente, y ejecutó el fragmento de código protegido (registración de usuario, grabación de comentarios, etc.) si el CAPTCHA fue resuelte de manera correcta.

Si redirige al usuario a una página diferente después de una completación CAPTCHA satisfactoria, y si quiere proteger esas páginas también, sería una buena idea configurar una variable de Sesión (Session["IsHuman"] = true, por ejemplo), y chequearla en las páginas subsiguientes. De otra manera, algunos robots podrían ser escritos para esquivar la página protegida por CAPTCHA e ir a las páginas que están después directamente, pasando por alto alguna parte de la protección.

Finalmente, como una nueva imagen CAPTCHA es mostrada cada vez que se carga la página y cada código CAPTCHA se puede validar sólo una vez (independiente del resultado de la validación), la entrada del usuario debería ser siempre limpiada después de la validación CAPTCHA.

Web.config

Listado del Código Fuente Completo

<?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option en Visual.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
  <connectionStrings/>
  <system.web>
    <httpHandlers>
      <add verb="*" path="LanapCaptcha.aspx" 
        type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect"/>
    </httpHandlers>
    <sessionState mode="InProc" cookieless="AutoDetect" timeout="20" 
      sessionIDManagerType="Lanap.BotDetect.Persistence.
      CustomSessionIDManager, Lanap.BotDetect" />
    <!-- 
      Set compilation debug="true" to insert debugging 
      symbols into the compiled page. Because this 
      affects performance, set this value to true only 
      during development.
    -->
    <compilation debug="false">
      <assemblies>
        <add assembly="System.Design, Version=2.0.0.0, 
          Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
      </assemblies>
    </compilation>
    <!--
      The <authentication> section enables configuration 
      of the security authentication mode used by 
      ASP.NET to identify an incoming user. 
    -->
    <authentication mode="None"/>
    <!--
      The <customErrors> section enables configuration 
      of what to do if/when an unhandled error occurs 
      during the execution of a request. Specifically, 
      it enables developers to configure html error pages 
      to be displayed in place of a error stack trace.

      <customErrors mode="RemoteOnly" 
        defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
      </customErrors>
    -->
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="LanapCaptchaHandler" />
      <add name="LanapCaptchaHandler" preCondition="integratedMode" 
        verb="*" path="LanapCaptcha.aspx" 
        type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect" />
    </handlers>
  </system.webServer>
</configuration>

Explicación

Las líneas necesarias para que BotDetect CAPTCHA funcione correctamente han sido marcadas con negritas, las demás líneas son valores estándar generados por Visual Studio 2005 por defecto.

El elemento <httpHandlers> registra la ruta usada por las peticiones de imagen y sonido CAPTCHA para ser procesadas por el código Lanap.BotDetect.dll. El elemento <system.webServer> sirve para el mismo propósito, pero es usado sólo por máquinas IIS 7.0 configuradas para integrar la tubería ASP.NET en el proceso IIS.

La declaración validateIntegratedModeConfiguration="false" asegura que el archivo web.config puede ser procesado por versiones anteriores de IIS (5.1, 6.0) así como también por la versión 7.0. Como la sintaxis de registración HttpHandler difiere de los modos de integración de las versiones IIS y ASP.NET, teniendo ambos elementos que hacen el archivo web.config compatible con todas las versiones IIS soportadas.

El elemento <sessionState> declara el mecanismo de persistencia usado por BotDetect para mantener los códigos CAPTCHA y configuraciones para cada usuario. Diferentes modos de Estado de Sesión, proveedores y timeouts pueden ser usados, pero el elemento sessionIDManagerType es requerido para arreglar un bug causado por Windows Media Player 11 cuando pide CAPTCHAs de audio (así como es explicado en preguntas frecuentes). También, un cuidado especial debería ser tomado si está corriendo múltiples servidores de carga-balanceada, como es explicado en este item de preguntas frecuentes.

El valor del elemento cookieless es ajustado para permitir que CAPTCHAs sean resueltos incluso para usuarios que tengan cookies desactivadas en sus navegadores. Sin embargo, note que para esos usuarios todas las Urls en la aplicación serían reescritas para contener un identificador de sesión, haciéndolas dinámicas. Esto puede causar problemas con varios crawlers (arañas de la web), que no soportan cookies como una regla.

Un efecto secundario común de esta configuración es que Google y otros motores de búsqueda pueden quedarse con múltiples copias de una página protegida por CAPTCHA en su índice (como siempre son redirigidas a una Url distinta). Si quiere que la página protegida por CAPTCHA sea indexada por motores de búsqueda, debería usar la configuración cookieless="false", o encontrar una forma de usar Sessiones sin cookies para usuarios humanos, pero no para crawlers (vía la cadena de User Agent, los archivos App_Browsers .browser, etc.)

language: English Español Tiếng Việt