¿Cómo generar una imagen Captcha en PHP?

En este artículo, veremos cómo generar una imagen Captcha muy simple y efectiva en PHP. Los captchas son sistemas de verificación inteligentes (al menos la mayor parte del tiempo) que evitan que los sitios tengan bots que roben datos del sitio o aumenten innecesariamente el tráfico del sitio. Además de prevenir el spam, los captchas también se utilizan como una capa de protección contra los ataques DDoS de piratas informáticos malintencionados.

Así que los captchas resumidos son súper útiles en este siglo XXI. Los captchas son tan importantes hoy en día (principalmente por razones de seguridad) casi siempre deben implementarse en un lenguaje del lado del servidor como PHP y no en JavaScript del lado del cliente. La razón es que se vuelve muy fácil para cualquier «robot» eludir la seguridad ya que la verificación se realiza en el lado del cliente (y ni siquiera implica ningún procesamiento de imágenes). Entonces, por esa razón, haremos Image Captcha en PHP usando la biblioteca GD (Graphics Draw) que generalmente se instala de forma predeterminada.

Para este artículo no usaremos ninguna función GD avanzada. Pero si desea obtener más información sobre GD, lea los diversos artículos de GeeksforGeeks al respecto.

Entonces, la idea principal de crear un captcha de imagen es tener primero un captcha.php que iniciaría una sesión y generaría captchas. 

  • captcha.php 

PHP

<?php
  
// We start a session to access
// the captcha externally!
session_start();
  
// Generate a random number
// from 1000-9999
$captcha = rand(1000, 9999);
  
// The captcha will be stored
// for the session
$_SESSION["captcha"] = $captcha; 
  
// Generate a 50x24 standard captcha image
$im = imagecreatetruecolor(50, 24); 
 
// Blue color
$bg = imagecolorallocate($im, 22, 86, 165);
 
// White color
$fg = imagecolorallocate($im, 255, 255, 255);
  
// Give the image a blue background
imagefill($im, 0, 0, $bg);
  
// Print the captcha text in the image
// with random position & size
imagestring($im, rand(1, 7), rand(1, 7),
            rand(1, 7),  $captcha, $fg);
  
// VERY IMPORTANT: Prevent any Browser Cache!!
header("Cache-Control: no-store,
            no-cache, must-revalidate");
  
// The PHP-file will be rendered as image
header('Content-type: image/png');
  
// Finally output the captcha as
// PNG image the browser
imagepng($im);
 
// Free memory
imagedestroy($im);
?>

Cuando pueda ejecutar captcha.php , debe tener una imagen pequeña con un captcha impreso. Ahora lo único que debemos hacer es crear un test.php que use captcha.php y valide captcha según la entrada del usuario. Para este ejemplo, lo mantendremos simple. Cuando el usuario nos da un captcha incorrecto, mostramos un mensaje de error y cuando nos da un captcha correcto, es posible que queramos redirigir al usuario a una URL diferente, pero por ahora, simplemente imprimiremos un mensaje.

  • prueba.php

HTML

<?php
 
session_start();
$msg = '';
 
// If user has given a captcha!
if (isset($_POST['input']) && sizeof($_POST['input']) > 0)
 
    // If the captcha is valid
    if ($_POST['input'] == $_SESSION['captcha'])
        $msg = '<span style="color:green">SUCCESSFUL!!!</span>';
    else
        $msg = '<span style="color:red">CAPTCHA FAILED!!!</span>';
?>
  
<style>
    body{
        display:flex;
        flex-direction:column;
        align-items: center;
        justify-content: center;
    }
</style>
  
<body>
    <h2>PROVE THAT YOU ARE NOT A ROBOT!!</h2>
     
    <strong>
        Type the text in the image to prove
        you are not a robot
    </strong>
  
    <div style='margin:15px'>
        <img src="captcha.php">
    </div>
     
    <form method="POST" action=
            " <?php echo $_SERVER['PHP_SELF']; ?>">
        <input type="text" name="input"/>
        <input type="hidden" name="flag" value="1"/>
        <input type="submit" value="Submit" name="submit"/>
    </form>
     
    <div style='margin-bottom:5px'>
        <?php echo $msg; ?>
    </div>
     
    <div>
        Can't read the image? Click
        <a href='<?php echo $_SERVER['PHP_SELF']; ?>'>
            here
        </a>
        to refresh!
    </div>
</body>
  • Producción: 

Aunque los Captchas pueden ser muy molestos, sin Captchas es posible que no conozcamos Internet como lo conocemos. Los captchas son esenciales para combatir el spam y mantener viva la web. 

No use este script en el código de producción: el problema principal con nuestro captcha de imagen es que cualquier programador experimentado puede crear fácilmente un bot que pueda procesar las imágenes y extraer el texto y enviar una solicitud POST y verificarse como humano. Para abordar este problema, tal vez podamos agregar líneas aleatorias, puntos (círculos de longitud unitaria), etc. en primer plano, pero el procesamiento de imágenes se ha desarrollado hasta el punto de que solo dificultaría un poco que el programador procese la imagen y la transforme . .
Entonces, la mejor solución es usar una biblioteca especializada y bien probada como reCAPTCHA de Google, que es fácil de integrar en su entorno PHP y también algo menos «dolor en el cuello» en comparación con los tradicionales «escribir el texto», ya que a veces puede no generar un captcha en absoluto si ya sabe que el usuario no es un bot basado en sus actividades anteriores.
 

Publicación traducida automáticamente

Artículo escrito por youngneer y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *