Hogyan lehetne megoldani a captcha kiértékelést?
PHP-ben írtam egy programot, ami elkészít egy véletlenszerűen generált karakterláncból egy képet (captchát). Vázlatszerűen valahogy így néz ki a kód többi része:
session_start();
/* véletlenszerűen generált 6 jegyű kód $string változóba és session-be mentve */
$str = md5(microtime() * mktime() * rand(1, 3256));
$string = substr($str,0,6);
$_SESSION[\\\'key\\\'] = $string;
/* felhasználó által beírt kód $ctcode változóba mentve */
$ctcode = $_POST[\\\'ctcode\\\'];
/* ha a $ctcode és a $string változó különbözik, akkor hibát ír ki oda, ahol majd megjelenik az $e5 változó */
if ($ctcode != $string) {
$e5 = "Az ellenőrző kód helytelen!<br />";
} else {
$e5 = "";
}
/* megjeleníti a másik fájlban generált captcha képet */
echo "<img src=\\\'modules/ctcode.php\\\' alt=\\\'\\\' />";
/* megjeleníti a kitöltendő űrlapot */
echo "<form action=\\\'index.php\\\' method=\\\'post\\\'>
<input name=\\\'ctcode\\\' type=\\\'text\\\' />
<input name=\\\'reg\\\' type=\\\'submit\\\' value=\\\'Kiértékelés\\\' />";
A kódnak csak azt a részét írtam le, ami lényeges (az űrlap többi részét és azoknak a kiértékelését itt kihagytam).
A probléma konkrétan az, hogy ha a felhasználó beírja a kódot és elküldi, akkor a kiértékelés előtt új kódot generál, és kiértékeléskor azzal veti össze a program a beírt kódot, és így sosem fog passzolni. Ezt az egészet úgy szeretném megoldani, hogy a kiértékelés és a kitöltendő űrlap egy oldalba legyen építve. De ha a kódgeneráló részt az űrlap után rakom, akkor a captcha képen nem fog megjelenni a kód, mert akkor előbb a kép fog megjelenni, és utána generálja a kódot.
Akkor mégis hogyan lehetne ezt megoldani?
Én úgy oldottam meg, hogy nem Session-be tettem a számot, hanem egy rejtett "hidden" inputba md5-el kódolva.
Az oldal legelején generálok egy kódot, majd ezt kiírom az oldalra, és az md5-el lekódolt számot beleírom a rejtett mezőbe.
Van egy input amibe bekérem a számot. és amikor elküldi az adatokat megvizsgálom, hogy:
$_POST["rejtett_mezo_erteke"] == md5($_POST["beirt_szam"])
Ha ez teljesül, akkor jó számot írt be.
A sessionnal az a gond, hogy egy bizonyos idő múlva lejár. Tehát ha pl betöltik az oldalt, majd 30 perc múlva írják be a számot, akkor valószínű nem fogja elfogadni.
Előző vagyok.
Esetleg egy próbát megér, hogy a feldolgozás UTÁN generálsz újabb értéket, és addig megőrzi a régi értéket.
Magyarul, miután megnézted, hogy jó kódot írt-e be, utána írod, hogy:
$str = md5(microtime() * mktime() * rand(1, 3256));
$string = substr($str,0,6);
$_SESSION['key'] = $string;
...
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!