István mai cikkéből kiderül, hogyan tudunk megelőzni néhány- tipikusnak mondható- CAPTCHA hibát.
A cikket elsősorban a webprogramozás iránt érdeklődőknek ajánljuk!
Valószínűleg mindannyian találkoztunk már automata Turing teszttel, ismertebb nevén CAPTCHA-val internetes regisztráció alkalmával.
Az ilyen tesztek arra valók, hogy kiszűrjék a robotokat és meggátolják, hogy a gépi regisztrációk elárasszák az adatbázisainkat. CAPTCHA elméletileg bármilyen olyan eszköz lehet, ami képes ember és gép között különbséget tenni, a legtöbb ilyennek azonban vannak korlátaik.
A legjellemzőbb ilyen korlát, a nyelv.
Bár az angol, az IT világ egyezményes nyelve, nem várhatjuk el, hogy minden felhasználó megértse a CAPTCHA ellenőrzéséhez szükséges instrukciókat.
Ennek kiküszöbölésére használjuk ma a karakterek képről történő leolvasását, mivel a regisztrációs űrlapon viszonylag egyértelmű feladatnak tűnik, másrészt, a szinte már szabványnak minősülő módszert ismerik a legtöbben, így nem okoz újdonságot.
Íme, egy példa a „karaktermásolós” CAPTCHA-ra:
Az alábbi CAPTCHA problémája a nyelv:
Most lássunk egy egyszerű scriptet, amivel ellenőrizni tudjuk, létező személy próbál-e regisztrálni az oldalunkon.
Tegyük fel, hogy a captcha.png kép egy CAPTCHA, amelyet egy másik script generál, és melynek értéke a SESSION tömb captcha elemében lett eltárolva.
<?php
session_start();
?>
<img src=’captcha.png’ /><br />
<input type=’text’ name=’ctext’ value=’Írja ide a fenti karaktersorozatot!’><br />
<input type=’submit’ name=’csub’ value=’Ellenőriz’><br />
<?php
if(isset($_POST[’csub’])){
$input=$_POST[ctext];
$captcha=$_SESSION[’captcha’];
if($input==$captcha)print ’Rendben<br />’;
else print ’Helytelen<br />’;
}
?>
A fenti kódrészlettel az a probléma, hogy a karakterek vizsgálatakor a script key sensitive, azaz megkülönbözteti a kis- és nagybetűket. A robotok dolgának megnehezítése érdekében érdemes vegyíteni a kis- és nagybetűket a CAPTCHA-ban, de ezzel a felhasználó munkáját is megnehezítjük.
Egy kis í-ről és egy nagy Í-ről, vagy kis o-ról és nagy O-ról nehéz megmondani, hogy melyik, melyik. A felhasználó ebben az esetben vagy új képet kér, vagy betippeli a betűt, reménykedve, hogy eltalálja.
Ezt a problémát kikerülhetjük úgy, hogy mind a felhasználó által beadott értékre, mind pedig a CAPTCHA-ra meghívjuk az strtolower() függvényt, amely a beadott string minden betűjét kisbetűvé változtatja.
Ezzel együtt érdemes a trim() függvényt is meghívni, hogy a véletlenül begépelt nem nyomtatandó karakterek (pl. szóköz) ne okozzon gondot a vizsgálatnál.
Ezek alapján érdemes a fenti kódrészletet a következőképp módosítani:
<?php
session_start();
?>
<img src=’captcha.png’ /><br />
<input type=’text’ name=’ctext’ value=’Írja ide a fenti karaktersorozatot!’><br />
<input type=’submit’ name=’csub’ value=’Ellenőriz’><br />
<?php
if(isset($_POST[’csub’])){
$input=trim(strtolower($_POST[ctext]));
$captcha=strtolower($_SESSION[’captcha’]);
if($input==$captcha)print ’Rendben<br />’;
else print ’Helytelen<br />’;
}
?>
Ha már felvetődött a kis- és nagybetűk problémája, akkor kitérünk egy másik nehézségre, amit a betűk hasonló alakja okoz.
A CAPTCHA-kat érdemes valamilyen nehezen olvasható betűtípussal kiíratni a képre, hogy a robotok nehezen tudják azonosítani a karaktereket.
Ez azonban azt is eredményezi, hogy a felhasználó is nehezen olvassa majd a betűket, mi több, egyes karaktereket képtelen lesz megkülönböztetni.
Gondoljunk csak bele, hogy vajon az 1-est, (egy) és a kis l (L) betűt kellene megkülönböztetni egymástól, vagy a 0-t, a nagy O betűtől. Ez a probléma egyszerűen kiküszöbölhető. Nem random számokat és ASCII karaktereket kell a képre írni, hanem általunk választott tetszőleges karaktereket, amelyetek egy tömbből olvasunk ki.
Az alábbi kódrészlet szemlélteti a captcha.php fájl egy részét:
<?php
session_start();
$karakterek=array(2,3,4,5,6,7,8,9,q,w,e,r,t,z,u,i,p,a,s,
d,f,g,h,j,k,y,x,c,v,b,n,m,Q,W,E,R,T,Z,U,I,P,A,S,D,F,G,H,J,
K,L,Y,X,C,V,B,N,M);
for($i=0;$i<8;$i++)$captcha=$captcha.$karakterek[$i];
$_SESSION[’captcha’]=$captcha;
?>
Látható, hogy a $karakterek tömbből hiányzik a 0, az 1, a kis o, és l betű, illetve a nagy O betű. Az s-S, p-P, w-W, z-Z, u-U, x-X problémáját az ellenőrző oldalon az strtolower() függvény, majd lekezeli.
Ha mindezen elővigyázatosságok sem elegendőek arra, hogy a felhasználó rendesen el tudja olvasni a képen megjelenő szöveget, akkor biztosítani kell neki, hogy újat tudjon kérni.
Erre egy egyszerű submit gomb elegendő, azonban ez újabb problémát vet fel.
A gombra kattintva az oldal újra betöltődik, és a korábban kitöltött cellák tartalma elveszik, ami nem túl felhasználóbarát megoldás.
Ez úgy kerülhető meg, hogy magát a CAPTCHA-t, és az újrakérő gombot egy másik weboldalon hozzuk létre, és ott, ahol látni szeretnénk, egy iframe-et készítünk, ami erre, a másik weboldalra hivatkozik.
Az iframe-en belül tehát csak a kép, és a gomb látszik. A gombra kattintás esetén, nem az aktuális oldal töltődik be újra, hanem az a lap, ahol a kép, illetve a gomb található, s így a korábban kitöltött űrlapelemek érintetlenek maradnak.
A Regisztrációs oldalon:
<iframe src=’captcha_oldal.php’></iframe>
A captcha_oldal.php:
<img src=’captcha.png’ /><br />
<input type=’text’ name=’ctext’ value=’Írja ide a fenti karaktersorozatot!’><br />
<input type=’submit’ name=’csub’ value=’Ellenőriz’>
Minden óvintézkedés ellenére, előfordulhat, hogy a felhasználó mégis elrontja a CAPTCHA-t.
Ebben az esetben természetesen a script nem hajtja végre, amit kellene, és valamilyen hibaüzenettel visszatér az oldalra. Ezzel ugyanaz a gond, mint az előző esetben: A lap újratöltődik, a cellák tartalma elveszik.
Ezt kiküszöbölhetjük úgy, hogy kereszthivatkozást hajtunk végre az oldalon, kihasználva az input mezők value értékét. Lássunk erre egy példát:
<?php
if(isset($_POST[’regisztalo_gomb’])){
$username=$_POST[’username’];
}
?>
<input type=’text’ name=’username’ value=<?php
if(isset($_POST[’regisztralo_gomb’]))print ’\’’.$username.’\’’;
else print ’\’\’’;
?>>
<br />
<input type=’submit’ name=’regisztralo_gomb’ value=’Regisztrál’>
A CAPTCHA akármilyen jó is, előbb-utóbb feltörhető lesz, ahogy a neurális hálók és MI rendszerek fejlődnek, ezért hamarosan ez a „karaktermásolós” megoldás idejétmúlttá válik.
A következő hónapban megnézzük, hogyan lehet megnehezíteni a robotok dolgát, majd pedig felvázollunk néhány újfajta Turing tesztet, amelyek a mai robotokkal még nem kijátszhatóak, de gyakorlati megvalósításuk még nem is megoldott.
Addig is jó gyakorlást kívánunk!
Legyen profi, képzett Webprogramozó, és biztosítsa helyét a május közepén induló Akkreditált Webprogramozó Mester csoportban!
Jelentkezzen a kiscsoportos képzésre legkésőbb május 12-ig!
Szerezzen Webdesigner és Webprogramozó végzettséget egyetlen képzés alatt!
Jelentkezzen májusi Akkreditált Web Artist tanfolyamunkra
legkésőbb május 16-ig!
A képzések jellemzői:
- Akkreidtált bizonyítványok (angol, magyar)
- álláslehetőségek a képzések végén releváns szakterületen
- részletfizetési lehetőség
- ajándék Pendrive!
További, induló májusi képzéseinket itt találja:
Májusban induló, informatika tanfolyamaink
Netlogi C School
Gyakorlat orientált informatika oktatás rugalmas időbeosztással!
www.netlogi-c.net