SOCL.cz
blog nejen o Internetu

Jednoduchá CAPTCHA v PHP

publikováno 20. 12. 2016 v 20:11

Rád bych vás nechal nahlédnout pod pokličku a ukázal vám dnes můj CAPTCHA PHP skript, který využívám na svém blogu. Snadnější to snad být nemůže.

CAPTCHA slouží ověření, že na druhém konci není (spamující) robot, ale člověk. Když uvážím, kolik stojí levná pracovní síla v Indii, kdy za pár šupů sedí Indové před monitory a jen louskají CAPTCHU, člověka napadne, zda to má ještě vůbec smysl. Ten spam si na váš server stejně cestu najde. :) A to nemluvím o robotech, co znají pokročilé techniky OCR a mohou sami louskat. Ale tak fajn, pojďme jim to trošku znepříjemnit.

Pro zprovoznění stačí podpora GD knihovny a SESSION v PHP, což je předpokládám naprostý standard úplně všude.

Soubor captcha.php:

<?php
error_reporting(0);

// nějaké ty základní parametry
define('VYSKA', 70);
define('SIRKA', 150);
define('DELKA', 6);
// používám font Creative Block BB
define('FONT', 'font.ttf');
define('COPY', 'socl.cz');

// spustíme SESSION
session_start();

$text = '';

// znaková sada - bez O a 0 - pletou se
$abc = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789';
$abc_len = strlen($abc);

// vytvoř obrázek
$im = imagecreate(SIRKA, VYSKA);
// s pastelovým podkladem
$pastel = imagecolorallocate($im, rand(100, 255), rand(100, 255), rand(100, 255));
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

// uděláme rámeček
imagerectangle($im, 0, 0, SIRKA-1, VYSKA-1, $black);

for($i=0; $i < DELKA; $i++) {
    $r = rand(0,4);
    // generujeme CAPTCHA kód znak po znaku
    $text .= $abc[rand(0,$abc_len-1)];
    // vykreslíme znak s jednoduchým stínováním
    imagettftext($im, 22+$r, $r, 11+(19*$i)+$r, 39+$r, $black, FONT, $text[$i]);
    imagettftext($im, 22+$r, $r, 9+(19*$i)+$r, 39+$r, $black, FONT, $text[$i]);
    imagettftext($im, 22+$r, $r, 12+(19*$i)+$r, 41+$r, $black, FONT, $text[$i]);
    imagettftext($im, 22+$r, $r, 10+(19*$i)+$r, 39+$r, $white, FONT, $text[$i]);
}

// doplníme copyright :-)
imagestring($im, 2, SIRKA-(strlen(COPY)*6+1), 0, COPY, $black);

// uložíme vygenerovaný kód do SESSION
$_SESSION['captcha'] = $text;

// nezbytná hlavička
header('Content-Type: image/png');
header("Cache-Control: no-cache, must-revalidate"); 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

// a vyplivneme obrázek
imagepng($im);
imagedestroy($im);
?>

Pokud pak skript zavoláte ve svém HTML kódu, např.

<img src="captcha.php" border="0" alt="captcha" />

měli byste vidět podobně vygenerovaný obrázek:

CAPTCHA
vygenerovaná CAPTCHA

Když pak zpracováváte data z formuláře, ve kterém byla takto CAPTCHA vygenerována, stačí zkontrolovat, zda zadaný kód z formuláře sedí s uloženým kódem v SESSION. Díky relativně velkým možnostem GD knihovny můžete takový obrázek vylepšovat dle libosti. Proč nemít každý znak jiným fontem nebo barvou, že? :)

štítky: bezpečnost CAPTCHA PHP spam
7761x přečteno

Komentáře k článku (2)

28. 12. 2018 v 5:17 Frantisek napsal(a)
132

11. 4. 2022 v 10:35 test napsal(a)
test


Přidejte komentář
Vaše jméno/přezdívka: (max 40 znaků)

Web: (nepovinné, zadejte s http(s)://, max 100 znaků)

Opiště sekvenci znaků:

captcha!

Zde napište komentář: (max 512 znaků)

Copyright © 2015-2024 SOCL.cz, RSS 2.0 RSS kanál blogu
Všechna práva vyhrazena, nebo tak nějak.

WEDOS BANNER