Captcha készítése

'09 nov 27. pé 16:37
Írta: kera

Szinte minden oldalon találkozhatunk már olyan képekkel melyek különböző karaktereket tartalmaznak, amiket a felhasználónak fel kell ismernie és beírni a megfelelő helyre, így kivédve a manapság igen kártékony bot-ok szemetelését.
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.


'10 már 9. ke 19:35
kpaxiprot
Hiányzik a tmp mappa a szerverről, az atw igényli ezt a mappát máshol nem nagyon találtam ilyet.:)

'10 jan 28. cs 18:31
tashi
Szia!

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/

'10 jan 18. hé 20:54
Balázs
Okés, köszi, megpróbálom...

'10 jan 18. hé 18:24
kera
Szia!

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.

'10 jan 17. va 18:30
Balázs
Hali!!!

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...

RSS
Összes hozzászólás: 1162, naponta átlag 4.08. Regisztrált felhasználók: 47
Utolsó 5 regisztrált felhasználó: misike7070, Kislakki, hunprobalazs, Dr_NiGGa, örökzöld
Copyright © 2009 tutorialok.hu - Tutorialok, segédletek sok kategóriában - Adatvédelmi nyilatkozat | Kapcsolat | Átváltom.com