Open source Captcha para PHP

Uno de los filtros antispam más comunes se conoce como Captcha y consiste en una imagen con una palabra escrita que el usuario humano debe escribir en un cuadro de texto para así ponérselo difícil a los bots de SPAM. El proceso resulta molesto para el usuario pero puede ayudar a filtrar el spam y en algunos casos incluso a evitar una oleada que casi tumbe tu servidor.

Si estás pensando en colocar uno de estos módulos en tu web te aviso de que existen opciones de código abierto (open source) como Secureimage, un captcha en PHP open source que puedes descargarte en su página oficial.

Para instalar éste Captcha open source en tu web basta con que descomprimas el archivo en el directorio de la misma e introduzcas las siguientes líneas de código:

Primero, pon ésta línea de código en donde quieras que se muestre la imagen con la palabra. Cuidado con la ruta de la imagen, ha de coincidir con la ruta en que se encuentra ese archivo en tu web.

<img id="captcha" src="/securimage/securimage_show.php" alt="CAPTCHA Image" />

Segundo, pon ésta otra línea de código que será el cuadro en que el usuario deberá escribir la palabra. Ojo con la propiedad name que la necesitaremos luego.

<input type="text" name="captcha_code" size="10" maxlength="6" />

Opcionalmente tenemos la posibilidad de habilitar la opción de recargar imagen por si el usuario es incapaz de reconocer la imagen generada automáticamente. Fíjate en que la id de la imagen anterior ha de coincidir con lo que apunta el getElementById y en que nuevamente la nueva ruta de la imagen debe coincidir con el archivo en tu web.

<a href="#" onclick="document.getElementById('captcha').src = '/securimage/securimage_show.php?' + Math.random(); return false">Cargar otra imagen.</a>

Ahora que ya tenemos preparada la interfaz que utilizará el usuario, debemos colocar un código en el servidor que recogerá lo enviado por el usuario y analizará si es o no correcto. Hay varias formas de hacer esto, yo he empleado un postback sobre la misma página, por tanto, establezco un condicional que en caso de estar realizando un postback y ya que en esa página es el único formulario posible comprueba que todo sea correcto.

Dentro del postback hay que colocar las siguientes instrucciones. Ojo con session_start(); que debe ejecutarse antes de que se haya escrito ningún HTML, lo mejor es colocarlo a principio de toda la página pero puedes ponerlo más abajo siempre que te asegures de que no se ha escrito nada de HTML aún.

if( strtoupper( $_SERVER['REQUEST_METHOD'] ) == "POST" ) { // Es un postback
  session_start();
  include './ModCaptcha/securimage.php';  
  $securimage = new Securimage();

  if ($securimage->check($_POST['captcha_code']) == false) {
    // El código no es correcto
  } else {
    // Envío email
  }
}

Como ves, tras crear y cargar el objeto Secureimage comprobamos si el código introducido por el usuario es correcto, a partir de aquí te toca a ti realizar las distintas operaciones para mostrar el error o enviar el mensaje etc.

Si te interesa colocar otro diseño a la imagen generada tienes varias opciones en ésta galería. Si quieres ver un ejemplo puedes pasarte por el formulario de contacto de mi web.

11 thoughts on “Open source Captcha para PHP”

  1. Hola, muy buen tutorial…pero en mi sistema de comentarios, el captcha no me funciona, es decir, al captcha se le pasa de largo…es como si no estubiese…alguna forma de solucionar esto?…yo quiero hacerlo como en tu contacto de tu web…gracias de ante mano

    hice todo lo que hicistes aqui
    :)

  2. Revisa que las rutas sean correctas, revisa que el método sea post y no get, revisa que el condicional (IF) que has puesto realmente canalice la petición correctamente y revisa que una vez que se mete por donde debe haga las comprobaciones correctamente.

    ¿Cómo? Pues a base de echos… =P

  3. Me preguntaba por que no haces uso de los captchas para que los usuarios envien su opinion…

  4. Por favor, he instalado esto y me va muy bien, pero necesito cambiar lo de que si uno se equivoca al escribir el captcha se cambie de página y se pierda todo su texto. He probado mil cosas para cambiarlo pero obviamente es que no tengo ni idea. Lo que tengo es lo mismo que viene en el script
    $securimage = new Securimage();
    if ($securimage->check($_POST[‘captcha_code’]) == false) {
    // the code was incorrect handle the error accordingly with your other error checking
    // or you can do something really basic like this
    die(‘The code you entered was incorrect. Go back and try again.’);
    }

    ¿Me puedes dar alguna pista para que salga como lo tienen ellos aquí?:
    http://www.phpcaptcha.org/try-securimage/

    o sea, el mensaje de error en la misma página.
    Mil gracias por tu ayuda

  5. Si se pierde el texto es porque al enviar los datos al servidor para hacer el envío debes recoger esos datos. Seguramente si te fijas en tu código eso se hace en algún momento pues debes estar guardándolos en alguna base de datos, por lo que seguramente haya una variable en la que se almacenan temporalmente.

    Al volver a mostrar la página debes volver a rellenar los campos con esos datos o de lo contrario la pagina que muestras no los tendrá.

    Me explico: Si el campo de texto A tiene un valor, al enviar la petición al servidor con el formulario el servidor recibe los campos y los valores que había en ellos.

    Debes aprender a recoger esa información.

    Una vez que sepas hacerlo, al devolver la página debes cargar esos datos en los campos. ¿Porque? porque la página que envías es una página NUEVA, nunca ha existido (es lo que tiene generar las páginas dinámicamente), por lo tanto está vacía a menos que la rellenes con los datos que había para que no se pierdan.

  6. hola a todos estoi mirando esos codigos i son para crear Captcha en una pagina php de vab bueno .Lo que yo nesesito es igual unos codigos de estos como el la pagina pero para una pagina que ja tiene el Captcha i coando me da el codigo que pase automatico de el i publicar el anuncio .lo nesesito por fafor .espero respuestas

  7. Tengo problema con el session_start(); no se ha encontrado session_start lo tengo al principio de la pagina web alguien le ha pasado algo parecido saludos.

Comments are closed.