Most az ilyen, úgynevezett captcha elkészítését és kezelését sajátíthatjuk el.
Hozzunk létre egy captcha.php nevű fájlt és nyissuk meg szerkesztésre. Ez a fájl lesz maga a kép.
A session_start() függvénnyel indítsunk egy munkamenetet. Ezután az str_shuffle() függvény segítségével, a billentyűzeten található összes betűt és számot, amik nem ékezetesek véletlen szerűen összekeverünk, majd a substr() függvénnyel levágjuk az első 6 karakterét. Ezután az egészet az strtoupper() fugvénnyel alakítsuk nagybetűssé és mentsük el a $text változóba.
<?php
session_start();
$text = strtoupper(substr(str_shuffle("0123456789qwertzuiopasdfghjklyxcvbnm"),0,6));
?>
Elértük, hogy a $text változó egy 6 számjegyű, véletlen generál karaktersort tartalmazzon.
Most el kell mentenünk ezt a számot egy $_SESSION változóba, hogy a cél oldalon is tudjuk a generált kódot, hogy a felhasználó által begépelt karaktersort le tudjuk ellenőrizni.
<?php
$_SESSION['captcha'] = $text;
?>
Most létrehozzuk a képet. Határozzuk meg a fejlécet, png képként. Ezután létrehozunk egy 200x50 px es képet utána pedig beállítjuk a hátterét fehérre.
Keressünk valami jó betűtípust, ami nem szabályos, egy robot számára nehezen felismerhető, de azért egy ember el tudja olvasni. Én a khand.ttf nevűt találtam, innen le tudod tölteni.
A $betu változóba adjuk meg a betűtípus elérési útvonalát, majd a $fekete változóba az imagecolorallocate() segítségével beállítunk egy fekete színt a szövegnek.
<?php
$betu = "khand.ttf";
$fekete = imagecolorallocate($image,0,0,0);
?>
Ha ez megvan akkor az imagettftext()-el tegyük rá a képre a $text tartalmát, próbáljuk úgy pozícionálni, hogy nagyjából a kép közepén legyen. Én kétszer is rátettem a szöveget, egymáshoz képest kicsit elcsúsztatva, így még jobban megnehezítve a bot dolgát
<?php
imagettftext($image,30,0,10,40,$fekete,$betu,$text);
imagettftext($image,30,0,16,46,$fekete,$betu,$text);
?>
Ha ez megvan már csak ki kell rajzolnunk a képet az imagepng()-vel
<?php
imagepng($image);
?>
Ha nem rontottunk el semmit valami ilyesmit kell kapnunk eredményül:
A captcha generálással készen is vagyunk. Hozzunk létre egy index.php-t és nyissuk meg.
Először megcsináljuk a formot és a captcha kirajzolását az oldalra.
<form action="index.php" method="post">
<img src="captcha.php">
<input type="text" name="captcha">
<input type="submit" value="ellenőriz">
</form>
Most menjünk a html kód elé és írjuk meg a PHP-t természetesen a jelek közé.
Itt is session_start()-al kezdünk, ezután megnézzük, hogy jött- post-olt captcha változó, ha igen megnézzük, hogy ez nagybetűssé alakítva megegyezik-e a $_SESSION['captcha'] -val, ha igen kiríjuk, hogy helyes kód, ellenkező esetben pedig, azt hogy hibás kód.
<?php
session_start();
if(isset($_POST['captcha'])){
if(strtoupper($_POST['captcha'])==$_SESSION['captcha']){
echo "helyes kód";
}else{
echo "hibás kód";
}
}
?>
Ezzel meg is lennénk, nem egy nagy durranás, de igen hasznos, hogy kivédjük a robotok támadását :)
Teljes forrás - captcha.php (tesztelve):
<?php
session_start();
$text = strtoupper(substr(str_shuffle("0123456789qwertzuiopasdfghjklyxcvbnm"),0,6));
$_SESSION['captcha'] = $text;
header('Content-type: image/png');
$image = imagecreate(200,50);
imagecolorallocate($image,255,255,255);
$betu = "khand.ttf";
$fekete = imagecolorallocate($image,0,0,0);
imagettftext($image,30,0,10,40,$fekete,$betu,$text);
imagettftext($image,30,0,15,45,$fekete,$betu,$text);
imagepng($image);
?>
Teljes forrás - index.php (tesztelve):
<?php
session_start();
if(isset($_POST['captcha'])){
if(strtoupper($_POST['captcha'])==$_SESSION['captcha']){
echo "helyes kód";
}else{
echo "hibás kód";
}
}
?>
<form action="index.php" method="post">
<img src="captcha.php">
<input type="text" name="captcha">
<input type="submit" value="ellenőriz">
</form>

Kommentek
Hozzászóláshoz be kell jelentkezned! Ha még nem lennél regisztrálva itt megteheted.
Lenne egy olyan problémám, hogy nekem nem működik ez a captcha. Mit csináljak, mi lehet a probléma?
A segítséget előre is köszönöm.
A captcha itt érhető el (minden ugyan olyan néven van, mint a példában, ha érdekel, azt is meg tudod nézni: http://agino.atw.hu/captcha/1/
A lényeg, hogy amikor elküldöd a formot akkor saját "magára" küld vissza, és az üres valüék helyére írasd ki a tartalmukat, pl: <input type="text" class="email_cim" name="email_cim" value="?=$_POST['email_cim']?>">
Ellenőrizz le phpval minden mezőt, ha hiba van akkor irasd ki a hibaüzenetet, ha nincs akkor eltárolod az adatokat, mjad továbítod (header('Location: ...')), vagy kiírod az üzenetet, hogy sikeres volt.
Színkódokat itt találsz, de ha rágekeresel RGB re biztos van még más is, az RGB kódot kell használni.
http://www.tayloredmktg.com/rgb/
pl: $image = imagecreate(200,50);
imagecolorallocate($image,139,137,137);
Ez is egy szürke lesz.
Nagyon szépen köszönöm ezt a tutort, már nagyon vártam, hogy egyszer alkalmazhassam, és most megadatott a lehetőség... Amúgy remekül működik, de egy kis segítségre lenne szükségem ezzel kapcsolatban. Az egyik, ami igazából apróság, hogy a fehér háttér helyett esetleg egy: Hex={E3,E3,E3}-as szürkét szeretnék berakni... Azt milyen színkóddal érhetem el??? Hiszen bármit beírtam, mindig feketére váltott. De igazából ez apróság... Az igazi kérdés: Ezt a captcha dolgot össze szeretném kötni egy ilyan dologgal:
<form id="hirlevel_feliratkozas" name="hirlevel" action="hirlevel_ellenorzo.php" method="POST">
<div class="email_cim">E-mail cím:</div>
<input type="text" class="email_cim" name="email_cim" value="">
<div class="teljes_nev">Teljes név:</div>
<input type="text" class="teljes_nev" name="teljes_nev" value="">
<div class="biztonsagi_kod">Biztonsági kód:</div>
<img src="captcha.php">
<input type="text" class="biztonsagi_kod" name="biztonsagi_kod" value="">
<div class="hirlevelre_feliratkozom" onclick="submitform()"></div>
</form>
Bocs, de hirtelenjében nem jutott eszembe a formázási kód... Tehát egy hírlevél-feliratkozásról lenne szó, e nagyszerű tutorial alkalmazásával... Olyat szeretnék, csak sajnos nem tudtam összehozni, hogy csak akkor küldje tovább az adatbázisnak az adatokat, hogyha a captcha elfogadásra került, különben az adatok megtartásával próbálkozzon újra... Valószínűsítem, hogy egy kis javascriptről lenne, szó, mely eldönti, hogy jó értéket adott-e vissza a php fájl... Valójában azt a php-t nem külön fájlban szeretném kiiratni, hanem egy alert ablakban...
Nagyon-nagyon jó néven venném, ha valaki tudna és lenne szíves segíteni ebben, úgy érzem más is hasznát vehetné akár, ha idetéved... Köszönetem örökké üldözné xd...