Ejemplo de validación con BotDetect CAPTCHA ASP

Este ejemplo de validación de un CAPTCHA contiene el código básico necesario para mostrar un CAPTCHA en una página ASP, validar su ingreso y finalmente mostrar un resultado sólo si la validación es satisfactoria.

Es posible que pueda usar este ejemplo de punto de partida para aprender a utilizar BotDetect, aunque también puede obtener resultados similares consultando la referencia de cómo añadir la protección de BotDetect CAPTCHA a formularios ASP.

Ubicación de los archivos del proyecto de ejemplo

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

También es posible accesar a esto desde el menú inicio:
Programas > Lanapsoft > BotDetect > ASP > v2.0 > Samples > CAPTCHA Validation Sample

BotDetectFormDemo.asp

Código fuente completo

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head>
    <title>BotDetect CAPTCHA ASP Form Demo - Input Page</title>
    <link type='text/css' rel='Stylesheet' href='FormStyle.css' />
    <script type="text/javascript" src="BotDetectScript.js"></script>
  </head>
  <body>
    <form name="SampleForm" id="SampleForm" method="post" 
      action="ProcessForm.asp">
    <fieldset id="SampleFields">
      <legend>Sample input form</legend>
      <div class="input">
        <label for="FirstName">First Name:</label>
        <input name="FirstName" id="FirstName" type="text" 
          class="textbox" value="<%=Request("FirstName") %>" />
      </div>
      <div class="input">
        <label for="LastName">Last Name:</label>
        <input name="LastName" type="text" id="LastName" 
          class="textbox" value="<%= Request("LastName") %>" />
      </div>
    </fieldset>
    <fieldset id="CaptchaValidation">
      <legend>CAPTCHA Validation</legend>
      <div id="PromptDiv">Retype the code from the picture</div>
      <div id="CaptchaDiv">
        <div id="CaptchaImage">
          <img id="SampleForm_CaptchaImage" src="
            LanapBotDetectHandler.asp?Command=CreateImage&
            TextStyle=4&ImageWidth=238&imageHeight=50&
            CodeLength=5&CodeType=0" alt='CAPTCHA Code Image' />
        </div>
        <div id="CaptchaIcons">
          <a href='LanapBotDetectHandler.asp?Command=CreateSound' 
            onclick='LBD_LoadSound("SampleForm_SoundPlaceholder", 
            "LanapBotDetectHandler.asp?Command=CreateSound");
            return false;' title="Speak the code"><img src="
            speaker.gif" alt="Speak the code" /></a>
          <a href='#' onclick='LBD_ReloadImage(
            "SampleForm_CaptchaImage"); return false;' title="
            Change the code"><img src="reload.gif" alt="Change the 
            code" /></a>
          <div id='SampleForm_SoundPlaceholder' 
            class="placeholder">&nbsp;</div>
        </div>
      </div>
      <div class="input">
        <label for="CaptchaCode">Code:</label>
        <input name="CaptchaCode" id="CaptchaCode" type="text" 
          class="textbox" onkeyup="this.value = 
          this.value.toLowerCase();" />
      </div>
      <%
      If (Request("WrongCode")<>"") Then
        Response.Write("<div><span id='CodeIncorrectLabel'>
          Incorrect code</span></div>")
      End If
      %>
      </fieldset>
      <div id="ActionDiv">
        <input type="submit" name="ProcessForm" value="Process Form" 
          id="ProcessForm" />
      </div>
      <div id="Note">
        <span>NOTE: the Trial version will use "LANAP" instead of a 
          random code in 50% of CAPTCHA images.</span>
      </div>
    </form>
  </body>
</html>

Explicación

Varios elementos Html añaden características relacionadas con seguridad al CAPTCHA:

  • En la sección <head> del documento, se incluye una hoja de estilo que, entre otras cosas, define los elementos de diseño CAPTCHA (FormStyle.css), y el archivo JavaScript que contiene funciones de BotDetect para reproducir el audio CAPTCHA y volver a cargar la imagen CAPTCHA ((BotDetectScript.js).
  • Se incluye la imagen del CAPTCHA, en la página, donde queremos que se muestre entre las etiquetas <body>, simplemente especificando LanapBotDetectHandler.asp?Command=CreateImage como la fuente de imagen, en donde puede añadir cualquier parámetro necesario adicional de la consulta.
  • Junto a la imagen CAPTCHA mostramos un par de iconos que permiten a los usuarios utilizar el sonido CAPTCHA, o cambiar la imagen CAPTCHA en caso de que resulte difícil de leer. Estos iconos se ligan a las llamadas de funciones de JavaScript a partir de la secuencia de comandos de cliente. El código JavaScript requiere para la reproducción de sonido un <div> vacío, donde el elemento <object>/<embed> se creará en el ícono del altavoz.
  • Además, note que el sonido del CAPTCHA ejecuta una llamada de JavaScript y aborta el enlace (con return false;) - si los usuarios tienen JavaScript inhabilitado o usan un navegador que no lo soporta, el icono del altavoz se comporta como un enlace normal y lo que hace es descargar un archivo .wav que puede ser reproducido como cualquier otro sonido descargado, en el reproductor predeterminado.
  • También hay un pequeño fragmento de código JavaScript asociado con el evento onkeyup del código CAPTCHA de texto, así las letras se ajustan a minúsculas automáticamente, mientras el usuario escribe. Esto no es estrictamente necesario para el CAPTCHA para funcionar, pero es útil para comunicar que el código CAPTCHA no es sensible a mayúsculas y minúsculas para los usuarios. Vale la pena encontrar tantas formas como sea posible para mejorar la usabilidad CAPTCHA y minimizar el impacto que tiene sobre la experiencia del usuario de su formulario.
  • El formulario también contiene un par de ejemplos al lado de los campos de entrada del CAPTCHA, simplemente para demostrar cómo el proceso de entrada del usuario sólo si el CAPTCHA se resuelve correctamente, y cómo mantener los valores ingresados por el usuario, en caso de que lo llene, pero con un código incorrecto.

ProcessForm.asp

Código fuente completo

<%
  'Captcha validation
  Dim result, codeKey, inputCode
  result = False
  codeKey = "LanapBotDetectCode"
  inputCode = Request("CaptchaCode")

  If (Session(codeKey)<>"") Then
    code = Session(codeKey)
    result = (0 = StrComp(inputCode, code, 1))
    'each Captcha code can only be validated once
    Session(codeKey) = ""
  End If

  If result = False Then
    first_name = Request("FirstName")
    last_name = Request("LastName")
    redirect_url = "BotDetectFormDemo.asp?FirstName=" + _
      first_name + "&LastName=" + last_name + "&WrongCode=WrongCode"
    Response.Redirect redirect_url
  End If
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
  <title>BotDetect CAPTCHA ASP Form Demo - Protected Page</title>
  <link type='text/css' rel='Stylesheet' href='FormStyle.css' />
</head>
<body>
  <form name="form1" method="post" id="form1" 
    action="ProcessForm.asp">
    <fieldset id="Properties">
      <legend>BotDetect CAPTCHA Validación passed!</legend>
      <div class="input">
        <label for="FirstName">First Name:</label>
        <input name="FirstName" id="FirstName" type="text" 
          class="textbox" readonly="readonly" 
          value="<% =Request("FirstName") %>" />
      </div>
      <div class="input">
        <label for="LastName">Last Name:</label>
        <input name="LastName" id="LastName" type="text" 
          class="textbox" readonly="readonly" 
          value="<% =Request("LastName") %>" />
      </div>
    </fieldset>
    <div id="ActionDiv">
      <a href="BotDetectFormDemo.asp">Back to the sample form</a>
    </div>
  </form>
</body>
</html>

Explicación

Cuando los usuarios llenan el formulario de ejemplo y lo envian, este código es utilizado para procesar la información. Hay ciertas cosas que debe considerar sobre el código de validación del CAPTCHA:

  • Siempre borre el código del CAPTCHA de una sesión anterior, sin importar si la validación fue correcta o no. Las imágenes CAPTCHA no deberían ser almacenadas temporalmente ni reusadas, así cada petición por una imagen es única y debe ser generada en el momento de la solicitud. Para recordar la validación, por ejemplo si el usuario ya se validó como humano pero quiere cambiar algo del formulario que llenó recientemente, es posible establecer una variable de sesión definiendo su validación (Session("IsHumanUser") = True) y comprobándola antes de desplegar el CAPTCHA nuevamente.
  • Cómo el código CAPTCHA es almacenado en una variable de sesión ASP, es importante verificar que las variables de sesión estén funcionando correctamente para su aplicación ASP. Estas variables se mantienen persistentemente en la memoria de IIS (pero no pueden ser compartidas por procesos o servidores), adicionalmente se basan en una cookie para recordar el identificador de sesión.
  • En este ejemplo, sólo hay una página protegida con un CAPTCHA. Si usted tiene una serie de páginas a proteger, tal como se comentó en un punto anterior, es recomendable utilizar algún mecanismo de detección de validación única en cada una de las páginas de la serie, como una variable de sesión (Session("IsHumanUser") = True) así el usuario no debe escribir constantemente el CAPTCHA ni un robot o usuario malicioso puede acceder a páginas de la serie que no estén protegidas.
  • Los usuarios que tengan desactivadas las cookies o naveguen sin soporte para ellas siempre tendrán variables de sesión temporales, pues no se podrá recordar un identificador del mismo, de esta forma nunca podrán resolver un CAPTCHA, incluso si escriben el código correcto van a recibir un error. Esto ayuda a detener robots (como por ejemplo Googlebot). Es importante tener en cuenta que las páginas que contengan algo protegido por un CAPTCHA nunca serán indexadas por buscadores, sin embargo las otras que contengan enlaces a páginas protegidas si podrán serlo, como sucedería normalmente.
  • Este código de validación de CAPTCHA asume que tiene instalado en el CAPTCHA sólo una vez dentro de la aplicación ASP, ya que utiliza un solo estado de la sesión para guardar el código CAPTCHA (Session("LanapBotDetectCode")). Si tiene el CAPTCHA instalado en múltiples formularios dentro de la misma aplicación, usted debe dar a cada uno de ellos un único identificador CAPTCHA (ejemplo "Registration" y "Comment"), y adjuntar este identificador a las peticiones de LanapBotDetectHandler.asp (como por ejemplo LanapBotDetectHandler.asp?Command=CreateImage&CaptchaId=Registration). Esto es necesario para evitar que diferentes códigos cifrados sobrescriban los demás códigos en diferentes páginas cuando se abren al mismo tiempo (en varias pestañas del mismo navegador).

LanapBotDetectHandler.asp

Código fuente completo

<%
Dim code, codeKey, codeHash, codeHashKey, captchaId, comCaptcha

'the Captcha code is kept in Session state with this key
codeKey = "LanapBotDetectCode"
codeHashKey = "LanapBotDetectCodeHash"

'if there are multiple Captchas on tn the site, a Captcha id 
'is required to distinguish between them; otherwise, it can 
'be ignored
captchaId = Request("CaptchaId")
If(captchaId<>"") Then
  codeKey = codeKey & "_" & captchaId
End If

If (Request("Command")="CreateImage") Then
'Captcha image generation

  'create the Captcha component instance
  Set comCaptcha = CreateObject("Lanap.BotDetect")

  'process Captcha properties
  If (Request("TextStyle")<>"") Then 'set Captcha algorithm
    On Error Resume Next
    comCaptcha.TextStyle = CLng(Request("TextStyle"))
    Err.Clear
  End If
  If (Request("ImageWidth")<>"") Then 'set Captcha image width
    On Error Resume Next
    comCaptcha.ImageWidth = CLng(Request("ImageWidth"))
    Err.Clear
  End If
  If (Request("ImageHeight")<>"") Then 'set Captcha image height
    On Error Resume Next
    comCaptcha.ImageHeight = CLng(Request("ImageHeight"))
    Err.Clear
  End If
  If (Request("CodeLength")<>"") Then 'set Captcha code length
    On Error Resume Next
    comCaptcha.CodeLength = CLng(Request("CodeLength"))
    Err.Clear
  End If
  If (Request("CodeType")<>"") Then 'set Captcha code type
    On Error Resume Next
    comCaptcha.CodeType = CLng(Request("CodeType"))
    Err.Clear
  End If
  If (Request("Format")<>"") Then 'set Captcha image format
    On Error Resume Next
    comCaptcha.Format = Request("Format")
    Err.Clear
  End If

  'set Captcha image Http response headers
  Response.Buffer = True
  Response.CacheControl = "no-cache, no-store, must-revalidate"
  Response.AddHeader "Pragma", "no-cache"
  Response.Expires = -1
  If (comCaptcha.Format="JPEG") Then
    Response.ContentType = "image/jpeg"
  ElseIf (comCaptcha.Format="PNG") Then
    Response.ContentType = "image/png"
  ElseIf (comCaptcha.Format="GIF") Then
    Response.ContentType = "image/gif"
  ElseIf (comCaptcha.Format="BMP") Then
    Response.ContentType = "image/bmp"
  End If

  'generate the Captcha image binary data
  Dim varPicture
  varPicture = comCaptcha.CreateImage

  'save the Captcha code for sound generation and validation
  code = comCaptcha.GetValue
  Session(codeKey) = code
  'save the code hash for backward compatibility with older 
  'validation code
  codeHash = comCaptcha.GetHashValue
  Session(codeHashKey) = codeHash

  'send Captcha image binary data to the client
  Response.BinaryWrite varPicture
  Set comCaptcha = Nothing 'dispose of the Captcha component instance
  Response.End
'end Captcha image generation

ElseIf (Request("Command")="CreateSound") Then
'audio Captcha generation

  'create the Captcha component instance
  Set comCaptcha = CreateObject("Lanap.BotDetect")

  'set Http response headers
  If (Request.ServerVariables("HTTPS")="off") Then
    Response.CacheControl = "no-cache"
    Response.AddHeader "Pragma", "no-cache"
    Response.Expires = -1
  End If
  Response.Buffer = True
  Response.ContentType = "audio/x-wav"
  Response.AddHeader "content-disposition", _
    "attachment; filename=captcha.wav"
  Response.AddHeader "Content-Transfer-Encoding", "binary"
  Response.AddHeader "Connection", "Close"

  'generate the audio Captcha binary data from the saved code
  code = Session(codeKey)
  varSound = comCaptcha.CreateSoundFromCode(code)

  'send audio Captcha binary data to the client
  Response.BinaryWrite varSound
  Set comCaptcha = Nothing 'dispose of the Captcha component instance
  Response.End
'end audio Captcha generation

ElseIf (Request("Command")="Validate") Then
'Ajax Captcha validation

  Dim result
  result = False

  If (Session(codeKey)<>"") Then
    Dim inputCode
    inputCode = Request("Code")
    code = Session(codeKey)
    result = (0 = StrComp(inputCode, code, 1))
    'Ajax validation shouldn't remove the code if successful, so both 
    'client- and server-side validation can be performed and pass
    If (Not result) Then
      Session(codeKey) = ""
    End If
  End If

  'Http response headers
  Response.Buffer = True
  Response.ContentType = "text/javascript"
  Response.CacheControl = "no-cache, no-store, must-revalidate"
  Response.AddHeader "Pragma", "no-cache"
  Response.Expires = -1
  Response.AddHeader "Connection", "Close"

  'send the JSON validation result to the client
  Response.Write "{ 'result': " & LCase(CStr(result)) & " }"
  Response.End

'end Ajax Captcha validation
End If

'If neither of the above conditions was met
Response.Status = "400 Bad Request"
Response.End
%>

Explicación

Este archivo es el módulo ASP central que se utiliza para acceder a su funcionalidad general relacionada con el CAPTCHA. Proporciona una sencilla interfaz HTTP al componente COM Lanap.BotDetect, que es responsable de la generación de todos los CAPTCHA, incluyendo imágenes y sonidos. Todos los ajustes de imagen se pasan al controlador como parámetros QueryString. El módulo también expone LanapBotDetectHandler.asp para realizar una validación de CAPTCHA en formato JSON simple, proporcionando un punto de acceso para la validación CAPTCHA Ajax.

Debido a las diferentes necesidades de imágenes y sonido en archivos enviados al cliente, se usan diferentes cabeceras http relacionadas con el caché de cada página. En particular, el CAPTCHA tiene una buena respuesta en cuanto a HTTP SSL, detectando un error conocido en Internet Explorer (dondela cabecera no-cache podría impedir la reproducción del archivo de sonido).

Tenga en cuenta que el código CAPTCHA es generado y guardado en el estado de la sesión durante la generación de la imagen CAPTCHA, lo que significa que el código CAPTCHA no existe antes que la solicitud por la imagen CAPTCHA sea procesada. Así, por ejemplo, no es posible acceder al CAPTCHA de sonido antes de que la imagen CAPTCHA.

Dado que cada aplicación ASP (cada directorio virtual de IIS configurada como una aplicación, con su propio archivo Global.asa) tiene su propio estado de la sesión, y múltiples aplicaciones ASP no puede compartir su estado de la sesión, no se puede reutilizar el archivo LanapBotDetectHandler.asp entre múltiples aplicaciones ASP - cada solicitud tiene que tener su propia copia de este archivo. Es posible volver a usar este archivo entre los diferentes directorios virtuales de IIS, siempre y cuando todos están configurados para ejecutarse en la misma aplicación ASP.

BotDetectScript.js

Código fuente completo

function LBD_LoadSound(soundPlaceholderId, soundLink) {
  if(document.getElementById) {
    var i = soundLink.indexOf('&d=');
    if (-1 != i) {
      soundLink = soundLink.substring(0, i);
    }
    soundLink = soundLink + '&d=' + LBD_GetTimestamp();

    var placeholder = document.getElementById(soundPlaceholderId);
    var objectSrc = "<object id='captchaSound' 
      classid='clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95' 
      height='0' width='0' style='width:0; height:0;'><param 
      name='AutoStart' value='1' /><param name='Volume' value='0' 
      /><param name='PlayCount' value='1' /><param name='FileName' 
      value='" + soundLink + "' /><embed id='captchaSoundEmbed' 
      src='"+ soundLink + "' autoplay='true' hidden='true' 
      volume='100' type='"+ LBD_GetMimeType() +"' 
      style='display:inline;' /></object>";

    placeholder.innerHTML = "";
    placeholder.innerHTML = objectSrc;
  }
}

function LBD_GetTimestamp() {
  var d = new Date();
  var t = d.getTime() + (d.getTimezoneOffset() * 60000);
  return t;
}

function LBD_GetMimeType() {
  var mimeType = "audio/x-wav";
  return mimeType;
}

var LBD_ImgId = null;
var LBD_Img = null;
var LBD_NewImg = null;
var LBD_Parent = null;
var LBD_ImagePrompt = null;

function LBD_ReloadImage(imgId) {
  if(imgId) {
    LBD_ImgId = imgId;
    LBD_Img = document.getElementById(LBD_ImgId);
    var src = LBD_Img.src;

    var i = src.indexOf('&d=');
    if (-1 != i) {
      src = src.substring(0, i);
    }
    var newSrc = src + '&d=' + LBD_GetTimestamp();

    LBD_NewImg = document.createElement('img');
    LBD_NewImg.onload = LBD_ShowImage;
    LBD_NewImg.id = LBD_Img.id;
    LBD_NewImg.alt = LBD_Img.alt;
    LBD_NewImg.src = newSrc;

    LBD_ImagePrompt = document.createElement('span');
    LBD_ImagePrompt.appendChild(document.createTextNode('loading...'));

    LBD_Parent = LBD_Img.parentNode;
    LBD_Parent.removeChild(LBD_Img);
    LBD_Parent.appendChild(LBD_ImagePrompt);
  }
}

function LBD_ShowImage() {
  if(LBD_NewImg && LBD_Parent && LBD_ImagePrompt) {
    LBD_Parent.removeChild(LBD_ImagePrompt);
    LBD_Parent.appendChild(LBD_NewImg);
  }
}

Explicación

Este archivo JavaScript CAPTCHA incluye funciones para la reproducción de sonido y recarga de la imagen CAPTCHA. Ninguno de estos es necesario, pero utilizando el código del lado del cliente mejora la usabilidad.

El CAPTCHA de sonido también puede ser usado sin JavaScript (descargando el archivo de sonido y reproducirlo en el reproductor de sonido que tenga instalado el usuario), pero la función LBD_LoadSound permite al archivo de sonido reproducirse directamente en el navegador, en la página donde se muestra el CAPTCHA. Por supuesto, esto asume que los usuarios tienen un reproductor de sonido instalado y configurado en su navegador. El CAPTCHA de imagen también puede ser cambiado por una recarga de toda la página, pero usando la función LBD_ReloadImage permite cambiarlo asíncronamente, proporcionando una mejor experiencia de usuario.

Ambas funciones de uso sencillo permiten una manipulación DOM para añadir elementos a la página dinámicamente. Para reproducir el sonido CAPTCHA, añadimos un elemento que apunta a un <object> contenido por un <div>. <embed> es un elemento anidado, proporciona compatibilidad entre navegadores, incluso si no es aprobado por los estándares del W3C. Cuando recarga la imagen CAPTCHA, se mostrará un texto de espera, para finalmente mostrar el nuevo CAPTCHA cuando está totalmente cargado y listo.

Para evitar cualquier tipo de almacenamiento en caché y garantizar un nuevo CAPTCHA de sonido / imagen, siempre se carga todo desde cero cuando el usuario hace clic en el icono correspondiente. Hay valores temporales que se añaden para ayudar a esta detección, como por ejemplo hora y fecha a la petición de un nuevo CAPTCHA.

FormStyle.css

Código fuente completo

body {
  background-color: #EEEEFF;
  font-family: Verdana, Arial;
  font-size: 0.9em;
}

fieldset {
  padding: 0 10px 10px 10px;
  margin: 11px;
  width: 300px;
  display: block;
}

div.input {
  margin: 7px 0;
}

legend {
  padding: 5px;
  color: #999999;
}

label {
  display: block;
  width: 85px;
  float: left;
  text-align: right;
  padding-right: 5px;
}

input.textbox {
  width: 170px;
}

input.textboxSmall {
  width: 40px;
}

#CodeIncorrectLabel {
  color: Red;
}

#CodeCorrectLabel {
  color: Green;
}

#Note {
  padding: 0;
  margin: 11px;
  margin-bottom: -7px;
  width: 320px;
  font-size: 0.8em;
  color: Red;
}

#PromptDiv {
  padding: 0;
  margin: 0;
  margin-bottom: 8px;
}

#ActionDiv {
  padding: 0 0 10px 10px;
  margin: 11px;
  margin-right: 0;
  width: 314px;
  text-align:right;
}

fieldset #ActionDiv{
  padding: 0;
  margin: 0;
  width: auto;
  text-align:right;
}

#CaptchaDiv {
  margin: 0;
  padding: 0;
  width:265px;
  height:50px;
  padding-bottom: 5px;
}

#CaptchaImage {
  float: left;
  margin: 0;
  padding: 0;
  width:240px;
  height:50px;
}

#CaptchaIcons {
  width: 22px;
  height: 50px;
  float: right;
  text-align: left;
  margin: 0;
  padding: 0;
}

#CaptchaIcons img {
  border: 0;
  margin: 0;
  padding: 0;
  padding-bottom: 3px;
}

*html #CaptchaIcons img {
  margin-bottom: -2px;
}

.placeholder {
  visibility: hidden;
  width:0 !important;
  height:0 !important;
}

*html .placeholder {
  display: none !important;
}

#CaptchaPreviewDiv {
  margin: 0;
  padding: 0;
  padding-bottom: 5px;
}

div.FeaturesInput {
  margin: 7px 0;
}

div.FeaturesInput label {
  width: 110px;
}

Explicación

Esta hoja de estilos define la apariencia de todas las páginas de estos ejemplos, y no sólo a los elementos CAPTCHA - puede copiar sólo las declaraciones en negrita a su hoja de estilo para abarcar sólo lo relacionado con el CAPTCHA.

Hemos fijado la disposición de los elementos CAPTCHA por lo que el altavoz y el botón para recargar se muestran verticalmente a la derecha de la imagen CAPTCHA. Si utiliza un CAPTCHA más pequeño en altura y desea que los iconos se muestren horizontalmente en lugar de verticalmente, sólo debe ajustar el ancho definido en #CaptchaIcons <div>. La imagen del CAPTCHA y el <div> que lo contiene tienen sus dimensiones definidas para evitar los cambios del diseño cuando se usa el botón Recargar (como el CAPTCHA se sustituye temporalmente con un <span> de diferentes dimensiones podría producir problemas inesperados).

El marcador de posición <div> utilizado para contener el altavoz durante la reproducción de audio CAPTCHA se hace invisible por las declaraciones de estilo, ya que queremos que el audio del CAPTCHA se reproduzca sin ningún tipo de cambios visuales en la página. Internet Explorer 6.0 se comporta muy diferente de otros navegadores con respecto a la visibilidad del altavoz para invocar el sonido, se utilizó entonces una declaración especial para IE 6.0, arreglando este problema.

Versiones Actuales de BotDetect

Advertencia

Esta página es una traducción no oficial de la página original: BotDetect CAPTCHA Validation ASP Code Sample y puede estar incompleta, incorrecta o poco actualizada.

Última traducción del 2009-12-18. Esto se aplica para los productos BotDetect ASP.NET CAPTCHA v2.0.15 y BotDetect ASP CAPTCHA v2.0.9.

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