Skip to main content

CAPTCHA bàsic amb PHP GD

Aquest codi utilitza l'extensió GD de PHP per crear una imatge CAPTCHA amb les següents característiques: text aleatori, distorsió de lletres, i elements de soroll (punts i línies) per dificultar la lectura automàtica.

El codi ha d'estar desat en un fitxer PHP separat (ex: captcha.php) i s'ha de carregar amb una etiqueta <img> al HTML principal.

Codi PHP (captcha.php)

PHP
<?php
// Funció per generar una cadena aleatòria
function generateRandomString($length = 6) {
    $characters = '23456789ABCDEFGHJKLMNPRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

// 1. Configuració i Generació del Text
$captcha_text = generateRandomString(5);

// Per emmagatzemar el text a la sessió (per a la validació posterior)
// session_start();
// $_SESSION['captcha_code'] = $captcha_text;


// 2. Creació del Llenç (Lienzo)
$amplada = 150;
$alçada = 40;
$imatge = imagecreatetruecolor($amplada, $alçada);

// 3. Definir Colors
$fons_color = imagecolorallocate($imatge, 230, 230, 230); // Gris clar
$text_color = imagecolorallocate($imatge, 40, 40, 40); // Gris fosc
$soroll_color = imagecolorallocate($imatge, 150, 150, 150); // Gris mitjà

// Omplir el fons
imagefill($imatge, 0, 0, $fons_color);

// 4. Afegir Soroll (Punts i Línies)

// A. Punts aleatoris
for ($i = 0; $i < 500; $i++) {
    imagesetpixel($imatge, rand(0, $amplada), rand(0, $alçada), $soroll_color);
}

// B. Línies aleatòries
for ($i = 0; $i < 5; $i++) {
    imageline($imatge, 
        rand(0, $amplada), rand(0, $alçada), // Punt inicial
        rand(0, $amplada), rand(0, $alçada), // Punt final
        $soroll_color
    );
}

// 5. Dibuixar Text Distorsionat
$x = 10;
$y = 30; 

// Dibuixa cada caràcter de la cadena
for ($i = 0; $i < strlen($captcha_text); $i++) {
    // Escollir un angle de rotació lleuger (+/- 15 graus)
    $angle = rand(-15, 15); 
    
    // Moure la posició Y verticalment (desalineació)
    $y_offset = rand(-5, 5); 
    
    // Utilitzem fonts TrueType (FreeType) per a millor aparença i rotació
    // Cal tenir una font TrueType (TTF) disponible al servidor (ex: Arial.ttf)
    // NOTA: Si no tens un fitxer TTF, utilitza la funció 'imagestring()' més simple.
    
    // Utilitzarem imagestring() aquí per ser més bàsic i no requerir TTF:
    imagestring($imatge, 5, $x, $y + $y_offset - 10, $captcha_text[$i], $text_color); 

    // Moure la posició X per al següent caràcter
    $x += 25; 
}


// 6. Sortida de la Imatge i Alliberar Memòria
header('Content-Type: image/png');
imagepng($imatge); 
imagedestroy($imatge);
?>

Per mostrar el CAPTCHA, simplement inclous una etiqueta <img> que cridi al fitxer PHP:

HTML
<p>Introdueix el codi de la imatge:</p>
<img src="captcha.php" alt="Codi de seguretat">
<input type="text" name="captcha_input">

image.png