Egyszerű PHP CAPTCHA készítése


Bizonyára mindenki találkozott már CAPTCHA biztonsági rendszerrel netezés közben. A szó egy angol rövidítés:

Completely Automated Public Turing test to tell Computers and Humans Apart” (teljesen automatizált nyilvános Turing-teszt a számítógép és az ember megkülönböztetésére).

A tutorialban egy alap-változatot fogunk készíteni:

  • Kiíratunk egy véletlenszerű szöveget egy képre (egy viszonylag egyedi betűtípust használva).
  • Ezt a kódot eltároljuk a háttérben, hogy később össze tudjuk hasonlítani azzal, amit a felhasználó elküldött egy űrlapon keresztül.

A feladathoz szükségünk lesz egy php-t futtatni képes webszerverre (GD library engedélyezése elengedhetetlen), egy külső TrueType betűtípusra, és kb. 10-15 perc szabadidőre.

Két fájlt fogunk létrehozni. A captcha.php maga a megjelenítendő kép lesz, a form.php pedig a teszt-űrlapunkat fogja tartalmazni.
Nyissuk meg a kedvenc szövegszerkesztőnket, mentsünk el egy új fájlt captcha.php néven, és írjuk bele ezt:

<?php
  session_start();
  header("Content-type: image/jpeg");
 
  // többi kód...
?>

A session_start() függvény engedélyezi a PHP munkamenet használatát ($_SESSION globális változó). A session-ből fogjuk ugyanis kiszedni az épp aktuális biztonsági kódot. A header() függvény megmondja a szervernek, hogy ezt a fájlt JPEG képként kezelje, ne text/html-ként.

Ezután létrehozzuk a képünket tartalmazó változót, majd definiálunk három színt:

$im=imagecreatetruecolor(150,40);
 
$feher=imagecolorallocate($im,255,255,255);
$fekete=imagecolorallocate($im,0,0,0);
$szurke=imagecolorallocate($im,125,125,125);

Az imagecreatetruecolor() függvény két paramétert vár: a kép szélességét és magasságát pixelekben. Az imagecolorallocate() függvény első paramétere maga a kép, a másik három pedig a kívánt szín R.G.B. kódja.

Következő lépésként generálnunk kell egy véletlenszerű karaktersorozatot (nyilván nem szeretnénk, ha a biztonsági kódunk állandó lenne). Erre rengeteg féle módszer létezik, nem célom ismertetni őket, én jelenleg az alábbit használom:

$chars="abcdefhjkmnpqrstuxy345789";
$str="";
for ($i=0;$i<6;$i++){
	$rand=rand(0,strlen($chars)-1);
	$str.=$chars[$rand];
}

Először definiálunk egy változót gyakorlatilag az angol ABC betűivel. Az $str változóba fogjuk belepakolni a captcha-kódot egy for ciklus segítségével. Jelen leírásban a kód hossza állandó 6 karakter, ezért ezt statikusan beleírtam a ciklusba. A $rand (random – véletlenszerű) változóban minden alkalommal generálunk egy véletlenszerű számot nulla és a $chars változó sztringjének hossza között a rand() függvény segítségével. Ezután hozzáfűzzük az $str változóhoz a $chars változó $rand-adik elemét (ami egy betű vagy egy szám). Miután lefutott a for ciklus, lesz egy állandóan változó, 6 karakterből álló zagyvaságunk.
Bizonyára feltűnt, hogy a $chars változóban nincs benne az ABC összes betűje és a számsor is egy kicsit hiányos. Ennek nagyon egyszerű oka van. A betűtípus esetében, amit használni fogok a tutorialhoz, nagyon könnyű egyes karaktereket összetéveszteni. Pl. egyes szám és kis “L”, “i”, a “G” betű és a hatos szám, “o” betű és a nulla, stb. Ezeket a karaktereket érdemes kiszortírozni a későbbi kellemetlenségek elkerülése érdekében.
Miután elkészült a kódunk, nincs más dolgunk, mint létrehozni egy session változót, és beletenni azt:

$_SESSION["captcha"]=$str;

Ha ezzel is megvagyunk, itt az ideje, hogy véglegesítsük a képünket:

  imagefill($im,0,0,$feher);
  imagettftext($im,20,0,12,32,$szurke,"font.ttf",$str);
  imagettftext($im,20,0,10,30,$fekete,"font.ttf",$str);
 
  imagejpeg($im);
  imagedestroy($im);

Első lépésben adunk a képnek egy háttérszínt az imagefill() függvény segítségével – jelen esetben fehéret. Az imagettftext() függvény gondoskodik arról, hogy bármilyen TrueType betűtípussal írhassunk a képünkre. A függvény paraméterei a következők: a képet tartalmazó változó, a szöveg mérete, a szöveg dőlésszöge, a szöveg x és y koordinátái, a szöveg színe, a betűtípus-fájl elérési útvonala (.ttf), valamint maga a szöveg. Látható, hogy jelen példában két imagettftext() függvény került meghívásra. Ez egy egyszerű árnyékolási technika. Fogunk egy szürke színt, és a képre íratjuk ugyanazt a szöveget ezzel a színnel 2-2 pixellel eltolva, és ez egy árnyék hatását kelti.
Utolsó lépésként az imagejpeg() függvénnyel létrehozzuk a képet, majd az imagedestroy() függvénnyel eltávolítjuk a memóriából. Ha minden jól ment, és megnyitjuk a böngészőben a captcha.php fájlt, láthatjuk az eredményt: véletlenszerű szöveg jelenik meg egy képen az általunk kiválasztott betűtípussal. Ha frissítünk, mindig más lesz a kód, és pont ez az, amit szeretnénk.
Következő lépésben teszteljük le akció közben is. Hozzunk létre egy teszt-űrlapot a form.php fájlban.

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>PHP CAPTCHA - Teszt</title>
  </head>
  <body>
    <form method="POST" action="form.php">
      <table>
        <tr>
          <th colspan="3">PHP CAPTCHA - Teszt</th>
        </tr>
        <tr>
          <td>Biztonsági kód:</td>
          <td><img src="captcha.php" alt="Biztonsági kód" title="Biztonsági kód"></td>
          <td><input type="text" name="captcha_code" value="" maxlength="6"></td>
        </tr>
        <tr>
          <td colspan="3" style="text-align:center;">
            <input type="submit" name="send" value="Adatok küldése">
          </td>
        </tr>
      </table>
    </form>
  </body>
</html>

Az egyszerűség kedvéért ez csak egy ilyen értelmetlen form, egyedül a biztonsági kód helyességét lehet vele ellenőrizni. A feldolgozó szkriptet ugyanezen oldal tetejére helyezzük, a HTML kód fölé:

<?php
  session_start();
 
  //űrlap feldolgozása:
  if (isset($_POST["send"])){
    if (strtolower($_POST["captcha_code"]) !== $_SESSION["captcha"]){
      echo "Hibás biztonsági kód!";
    }else{
      echo "Helyes biztonsági kód!";
    }
    echo "<br><a href=\"form.php\">Vissza</a>";
    exit;
  }
?>

Fontos, hogy minden oldalon, ami használja a captcha-t, hívjuk meg a session_start() függvényt, mert enélkül nem férünk hozzá az aktuális kódhoz a háttérben. Egy if elágazásban megnézzük, hogy a felhasználó megnyomta-e az “Adatok küldése” gombot. Ha igen, összehasonlítjuk az általa elküldött kódot a $_SESSION-ben találhatóval. Az strtolower() függvény átalakítja a nagy betűket kicsivé, mert jelen példában a rendszer nem törődik a kis- és nagybetűk közti különbséggel. Ezután értelemszerűen, ha nem talál egyezést, kiírja, hogy “Hibás biztonsági kód!”, ellenkező esetben “Helyes biztonsági kód!” feliratot kell látnunk.
Az elágazás után van egy “Vissza” link, amely újratölti az űrlapot.

Az előbbiekben tehát láthattátok, hogyan lehet egy rendkívül egyszerű, ám mégis használható PHP CAPTCHA-rendszert létrehozni. Természetesen, ennél vannak sokkal összetettebb, profibb rendszerek is, sőt, kellenek is, ha az ember egy nagy látogatottságú weboldalt fejleszt, de azon rendszerek alapja is ugyanez. Maximum a körítés változhat (pl. mindig változó szöveghossz, elforgatott betűk, különböző “zavaró” ábrák a háttérben, karakterenként változó betűtípusok, stb). A spam-botok nagy részét viszont a “kistesó” is megállítja, úgyhogy, ha nincs jobb, mindenképp használjátok :) !

Kapcsolódó bejegyzések:
  • Felmerült egy kérdésként, hogy lehetne egy login oldal tartalmánál (belépési név és jelszót kell megadni) jelezni a felhasználók számára azt, hogy melyik mező mi …

  • A paraméter átadásnak egyszerű html-ből 3 ismert módja a sütik, a GET és a POST. Mind a 3 megoldásnak megvannak az előnyei és hátrányai. Nézzük sorra.SÜTIK …

  • A PHP segítségével könnyen megoldható, hogy egy lapon váltogatni lehessen a stílusok és template-k között (attól is függ hogy a CSS-ben csak a formázásra vonatko …

  • Sokszor felmerül az igény a késleltetésre egy banner elkészítése során. Ezt egyszerűen meg tudjuk oldani egy setInterval és egy clearInterval függvény használatá …

  • Weblapkészítés során ha egy olyan oldalt kell készíteni, hol egy vagy akár több input mező is van (regisztráció, kapcsolatfelvétel stb..), hasznos lehet megadni, …

A cikket beküldte: mrMiller (http://tommolnar.hu/)

50 hozzászólás

  1. Suttogo says:

    Javaslatok:
    Ha már kiszortíroztuk a hasonló karaktereket, az egyiket közülük legalább hagyjuk bent. Utána majd kölcsönösen egymásnak elfogadjuk őket. Egyszerűen így:

    str_replace(array('6','1'),array('G','l'),$beirtkod);

    Valamint javaslom hogy a captcha képen jelenjenek meg kis-nagy betűk váltakozva. Ha a megjelenítés után a véletlen kódot is kisbetűsítjük, akkor a látogatótól ugyanúgy elfogadjuk mindkét betűt, a robotokat viszont megzavarhatja.

    Az már tényleg csak extra kategória, hogy a képen a szöveget karakterenként írjuk ki, véletlenszerű szögben megdöntve +- néhány px-el elmozgatva a betűket…

  2. BlackY says:

    Igen, bármeddig lehet bonyolítani. És pont ez a bajom a képes captcha-val, az egyre okosabb botok miatt ma már mindenhol olyan képeket raknak ki, amiknél nekem már pár percet gondolkodnom kell, hogy melyik karakter mi lehet.

    Ezért kedvelem jobban a szöveges captchákat, ahol egyszerű kérdéseket kell megválaszolni (“Mennyi ötször öt?”, “Mi a magyarországi X mobilszolgáltató körzetszáma?”, “Hány éves a norvég király?”), kevesebb oldalletöltés, a botokat marha jól védi, és ha tényleg közismert dolgokra kérdezel rá, akkor nem is csak az egyszerű algebrai feladatokat adhatod ki. Sőt itt lehet mókázni, hogy a “nem tudom”, “tököm tudja” típusú válaszokat is elfogadod, azt egy bot magától nem találja ki.

    Ezzel a kóddal össz-vissz annyi a bajom, hogyha több tabon nézek egy oldalt és egy oldalon kérnek tőlem kódot, de közben a másikon valamiért betöltök egy captchás oldalt (ahol akár nem is akarok írni semmit), akkor sem fog az eredeti tabon elfogadni, mert a session-ben már csak az új kód van (kivédhető azzal, hogy pakolod a captcha kódokat egy tömbbe)

    BlackY

  3. bolint says:

    Tetszett a tutorial, egy alap rendszert valóban össze lehet így rakni. Azoknak akiknek összetetteb kell ajánlanám a következő PHP osztályt: http://www.ejeliot.com/pages/2
    Mi ezt használjuk majdnem mindenhol és eddig mindent tudott.

  4. mrMiller says:

    Suttogo: “Ha már kiszortíroztuk a hasonló karaktereket, az egyiket közülük legalább hagyjuk bent.” – teljesen igazad van, nem is értem miért nem jutott ez eszembe, amikor írtam a tutorialt, majd legközelebb jobban odafigyelek ;-) A karakterek különválasztása és azok mérete, dőlésszöge viszont már nem tartozik az “egyszerű”-höz, ezért nem is erőltettem ebben a leírásban. Ezt tényleg csak egy kiindulási pontnak szántam azoknak, akik még soha nem írtak ilyen szkriptet.
    BlackY, az általad említett “okos” módszer nekem személy szerint nagyon tetszik, talán csak annyi baj van vele, hogy nem kevés időt kell rászánni, hogy egy elég részletgazdag kérdés-válasz mennyiséget szedjen össze az ember (bár a biztonság az első, és ha ez beválik, akkor megéri). Valamint ki lehet még bővíteni a (pl.) “Milyen állatot látsz a képen?” módszerrel, amivel aztán a botok tényleg nem nagyon tudnak mit kezdeni.

  5. fape says:

    A leírás érthető, és kiindulási alapnak jó.
    Én úgy vagyok vele ha már captcha, akkor legyen valami értelme is. Ezért használom a http://recaptcha.net -t.
    Párszó róla:
    Könyveket/újságokat scannelnek és amit az írásfelismerőjük nem tud felismerni az megkapják a userek. Mindig 2 szó van a képen, egyikről tudja, hogy micsoda másikról nem. És persze van hozzá php könyvtár is.

  6. mango says:

    én egy olyan egyedi capthát szeretnék csinálni, amit blacky is mondott, egyedi kérdésekből álljon.
    de nem tudom ezt hogy hívják (angolul pláne nem) és így még ráguglizni sem tudok normálisan
    ezért segítsetek valami leírást találni hozzá!
    előre is nagyon köszönöm!

  7. Festő says:

    Hy.
    Az az egyedi captcha tényleg jó ötlet, szerintem megvalósítom én is.
    Szerintem túl nagy kérdés adatbázist nem kell hozzá kreálni, ha már van vagy 20-30 kérdés – válaszod már egy alapnak tökéletes.

    Mango, mire szeretnél rákeresni a google ban?
    Ezt megcsinálni azért nem nagy feladat :)

    Mondjuk azon gondolkodtam, hogy a kérdést érdemes-e képpé konvertálni…
    Vélemény?

  8. Lazca says:

    Kipróbáltam és jól működik.
    Viszont az a problémám támadt hogy ha kiíratom a $_SESSION-t, akkor az nem egyezik az aktuális értékkel.
    Itt látható:
    http://carysma.extra.hu/pr/captcha2/
    Mindig az előző értéket írja ki.
    Hogyan tudok az éppen aktuális $_SESSION értékhez jutni? (Nem nagyon vágom a php-t).
    Ha tudna segíteni valaki azt megköszönném.

    Boldog Karácsonyt!

  9. mrMiller says:

    Próbáld meg php-val összehasonlítani az értékeket az oldal tetején a form feldolgozásakor (ahogy a tutorialban is látod). valószínű azért mutatja a régit kiíratásnál, mert előbb íródik ki, mint ahogy az új session változó deklarálódna (a session-beállítás a kép forráskódjában van, tehát először kiíratod a kódot szövegesen, majd meghívod a képet, ami létrehoz egy újat).
    nekedis Boldog Karácsonyt!

  10. Lazca says:

    Soha nem jöttem volna rá, redig annyira logikus! (legalábbis így utólag)

    Köszönöm!

  11. ujbeszel says:

    Hello!
    Van egy kis problemam, valamiert a fent megadott kod jol mukodik operaban, de ie vagy firefox alatt nem registralja be a session-ba az str valtozot a captcha.php. Igy termeszetesen a form.php-ban a captcha nem kap erteket, mindig hibas az eredmeny.
    Tudja valaki miert van ez?
    Koszonettel
    Ujbeszel

  12. zoo says:

    A helyzet az, hogy pontosan ugyan azt írtam be a <?php
    captcha.php -ba ami a leírásban szerepelt, ellenben nem jelenik meg az a bizonyos kép.

    Mi lehet a hiba?

    <?php
    session_start();
    header(“Content-type: image/jpeg”);

    // többi kód…

    $im=imagecreatetruecolor(150,40);

    $feher=imagecolorallocate($im,255,255,255);
    $fekete=imagecolorallocate($im,0,0,0);
    $szurke=imagecolorallocate($im,125,125,125);
    $chars=”abcdefhjkmnpqrstuxy345789″;
    $str=””;
    for ($i=0;$i

  13. DABZSE says:

    tiszteletem!
    “sokáig” vadásztam 1ilyen script-et, van is páram, de azok vmiért nem akartak eléggé jól működni.. ez remekül végzi a dolgát (opera9, opera10, firefox3, ie6), és, ahogy írták: kiindulópontnak tökéletes! lesz benne alakítás (ez csak természetes) és a többiből is teszek hozzá vmit.. nemtudom, hogy mikorra lesz meg. nekem csak a vendégkönyvemhez kell. ne kérdezzétek, hogy miért. magam sem tudom x)
    ami a szöveges megoldást illeti: nem tetszik.. mi van akkor, ha éppen olyan személy van az oldalon aki nem érti a nyelvet és a kérdést sem? pedig szeretne vmi fontosat írni..

    ez a többieknek akik máshonnan használják:
    ha már kell rá a biztonság, akkor ne máshonnan add az oldaladhoz, csinálj sajátot.. olyan lesz amilyen, de legalább a saját és tudod, hogy mi hol van benne, bármikor át birod írni..

    nekem ez alapnak megteszi (mint már írtam), mivel még csak kezdő a php tudásom..

    további szépeket :-)

  14. mau says:

    Sziasztok. Nem hiszem, hogy a kis progi lenne a hibás nálam, mert localhost – on megy minden böngibe, de az fw – n valamiért nem megy. :( Ha esetleg tudtok valamit trükköt azt elfogadnám. Köszönöm.

  15. mrMiller says:

    Többféle probléma is lehet. Először is sokat segítene egy hibaüzenet (már persze ha van…).
    Lehet hogy nincs is engedélyezve a GD. Ha igen, akkor az is lehet, hogy az imagettftext() függvény van letiltva (valahol tapasztaltam már ilyet). Vagy például egyszer asszem egy atw-s oldalnál találkoztam olyan “hibával”, hogy ahhoz, hogy a session-t tudd használni, létre kellett hozni egy /tmp mappát a /www-n belül, mert egyébként elszállt az oldal, ha meghívtad a session_start()-ot.
    Azt tudom javasolni (mivel még nem fejlesztettem fw-s oldalt), hogy valami support-os mail címre írd meg, hogy mi a problémád, írd bele hogy milyen beépített függvényeket szeretnél használni. Aztán remélhetőleg gyorsan megtudod, mi a gond.

  16. Bence says:

    Egy példaoldal nincs? Csak, hogy lássam, miképp is néz ki. :-) (lusta vagyok beírni MÉG :D)

  17. mau says:

    Semmi hibaüzenet nincs, egyszerűena képet nem jeleníti meg. Több mint bizonyos, mivel ingyenes tárhely egyes függvények tiltottak a szerveren. Írtan nekük, és megírtam a használatban lévő fuggvéyneket is. Várom válaszukat. Ha írnak, és érdemleges választ kapok, akkor itt megosztom.

  18. Bence says:

    Nem lehet, hogy a font.ttf hiányzik?

  19. Bence says:

    Kipróbáltam ultraweben, nem jó.

  20. Bence says:

    Nekem most fizetős tárhelyen cannot send header informations, already sent by típusú és valami session-ös problémát is jelzett…

  21. mau says:

    www.web-x.fw.hu
    Itt lehet látni mit művel

  22. mau says:

    helyesebben :
    http://www.web-x.fw.hu/index.php?tartalom=6&nyelv=hu

  23. Bence says:

    Nálam valami baj van, üzenet (fizetős tárhely, a weblap címét WEBLAPpal helyettesítettem):

    Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at WEBLAP/captcha.php on line 8

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at WEBLAP/captcha.php:7) in WEBLAP/captcha.php on line 8

    Warning: Cannot modify header information – headers already sent by (output started at WEBLAP/captcha.php:7) in WEBLAP/captcha.php on line 9 ….

  24. Bence says:

    mau: azt mondja a captcha.php-nál, hogy : A következő kép nem jeleníthető meg, mert hibákat tartalmaz.

  25. mrMiller says:

    mau: jobb klikk a hibás képre, kép megjelenítése (firefoxban), utána fájl menü, oldal mentése. Lemented a fájlt valahová, és megnyitod egy szövegszerkesztővel (ha nem megy, szedd le a .gif kiterjesztést a névből és úgy próbáld). én megcsináltam, van egy hibaüzenet a képben:

    <br />
    <b>Warning</b>:  imagettftext() [function.imagettftext]: Could not find/open font in <b>/storages/storage1/w/we/web-x/public_html/lap/captcha.php</b> on line <b>21</b><br />
    <br />
    <b>Warning</b>:  imagettftext() [function.imagettftext]: Could not find/open font in <b>/storages/storage1/w/we/web-x/public_html/lap/captcha.php</b> on line <b>22</b><br />

    rossz a font fájl, vagy rossz helyen hivatkozol rá. esetleg próbálj meg teljes elérési útvonalat adni neki stb.

    A session problémához: írjd rögtön a php nyitó után a session_start()-ot, és csak utána a header(“content-type… – t.
    Ha nem jó így sem, akkor az első sorba egy ob_start(); a legutolsóba pedig egy ob_end_flush(); hívást csinálj. (Bővebben erről itt: http://hu2.php.net/manual/en/function.ob-start.php). Ha így sem megy, akkor még alszok rá :)

  26. mau says:

    mrMiller én úgy gondolom nem ismeri fel a ttf kiterjesztést a szerver. Az utvonalakkal eljátszadoztam, de nem javult a helyzet. Az imagettftext() függvény le van tíltva véleményem szeeint, de kiderül, mert elkérték a kódot, és megnézik.

  27. Harder says:

    Bence, ezeket a nagy hiba blokkokat légyszives tedd egy txt-be, töltsd fel valahova és egy hivatkozást tegyél csak be ide, vagy még kényelmesebb talán ha használod pl. ezeket a szolgáltatásokat (direkt ilyen céllal készültek):
    hxxp://pastebin.com
    hxxp://pastie.org
    hxxp://gist.github.com

  28. Fáraó says:

    Ez használhatatlan.
    A normálisabb böngészőkben ez a kód szerintem le van tiltva. Próbáltam Operába és rókába is, IE-re nem vetemedek bocs…

  29. mrMiller says:

    “A normálisabb böngészőkben ez a kód szerintem le van tiltva”. Mire gondolsz? egy php-kódra?
    Az szerver oldalon fut. A böngésző csak annyit tud, hogy van egy kép amit meg kell jeleníteni… Semmi köze a backend-hez.

    Érdekes módon nekem mindenhol működött.

    Szerintem neked azzal van a bajod, hogy a tárhelyszolgáltatód nem engedélyezi az imagettftext() (vagy valami más GD) függvény használatát. javaslom töltsd le a captcha kép-fájlt, nyisd meg egy texteditorral és nézd meg mi van benne…

    IE-re én sem vetemednék, de sajnos a felhasználók igen nagy százaléka azt használja :(

  30. Feriman says:

    Helló!

    Én eddig bármilyen captcha-t akartam használni, soha nem működött, mert hibába írtam be az ellenőrző részbe bármit ( vagy semmit ), mindig továbbengedett. Mi lehet a probléma?

    Kösz!

  31. mrMiller says:

    Feriman, valami session problémára tudok hirtelen gondolni. Azt gondolom tudod (nyilván tudod ha végigmentél ezen a tutorial-on), hogy a kép elkészítésekor, amikor generálsz egy captcha-kódot, akkor azt egy session-változóban el kell mentened. Ha ezt megfelelően csinálod meg (session_start() függvényre gondolok), akkor nem igazán lehet baj.
    A másik dolog ami rossz lehet, az a feldolgozás… De itt sem túl sok a hibalehetőség. Veszed a session-ben eltárolt kódot, meg a form-on keresztül elküldött sztringet, és egy szimpla if – else elágazásban ellenőrzöd: if ugyanaz: adatok továbbítása, else: hibaüzenet megjelenítése…
    Ha konkrét hibát, hibaüzenetet, tudnál küldeni, okosabbak lennénk.

  32. Feriman says:

    mrMiller, kösz a választ!

    Én egy olyan captcha-hoz néztem a tutorial-t, ami egy kérdésből áll, és egyféle válasz van rá ( pl. 2*3 ). Kipróbáltam ezt a verziót is, de ez sem működik :( Hibakódot nem ad, csak simán továbblép…

  33. BlackY says:

    Feriman: ennél a tutorialnál egyedül annyi tippem van, hogy a formodban nem volt send nevű mező, ezért le sem futott a captcha-hoz tartozó ellenőrzés a form ellenőrző kódodban.

    BlackY

  34. gyuri says:

    Sziasztok
    És azt hogy lehet megoldani hogy ha jó a képkód akkor tovább küldjön pl: az index.php-ra ?

  35. gyuri says:

    Megoldottam.
    Egyébként én nagyon szépen köszönöm nekem tökéletes és értelmes meghát nem 1 nagyoldalra kel.
    Thx

  36. mareszkukac says:

    Sziasztok!

    Nekem a következő problémám adódott.
    Van egy kis hiba a tutoriálban ami csak linuxos szervereken jön elő (nekem ezért nem működött szerveren csak a localhostomon).
    Amikor a font.ttf -re hivatkozunk elé kell raknunk a mappa hivatkozást.
    Ebben az esetben:

    hibás:

    1
    
     imagettftext($im,20,0,12,32,$szurke,"font.ttf",$str);

    javított:

    1
    
    imagettftext($im,20,0,10,30,$fekete,"./font.ttf",$str);

    Egyébként nagyon köszönöm mert érthető és jól működő a tutorial.
    Sokat tanultam belőle.

  37. gyuri says:

    Szia igen ez akkor jelentkezik ha a captcha fájlokat külön mappába rakjuk de ahogy nállatok van ez (imagettftext($im,20,0,10,30,$fekete,”./font.ttf”,$str);) ez egy mappával megy vissza hapedig a fő gyökér mappára akartok hivatkozni akkor meg így lenne a jó (imagettftext($im,20,0,10,30,$fekete,”../font.ttf”,$str);) De ez nemcsak linuxnál igaz hanem windowsnál is.De a pont is elhagyható a direkt elérést akar valaki így valahogy (imagettftext($im,20,0,10,30,$fekete,”mappa/font.ttf”,$str);)
    Egyébként én is sokat tanultam ebből.

  38. mareszkukac says:

    Ezt nem igazán értem.
    a ./font.ttf az ugyan arra a mappára vonatkozik mint amiben a captcha.php van.
    a ../ pedig egy mappával feljebb lép, nem feltétlenül a gyökérbe.
    pl:
    ./ – saját mappa
    ../ – egy mappával megy feljebb
    ../../ – két mappával megy feljebb
    és így tovább

  39. gyuri says:

    Igen igazad van feljebb de visszafele is igaz ez.Na leírom hogy nálam hogy van.
    A captcha.php a fő gyökérben van a fontjai pedig egy captchafont nevű mappában vannak és a captcha.php ban a fontok elérését így adtam meg
    imagettftext($im,67,5,10,90,$szurke,”captchafont/Vera.ttf”,$str);
    végül is erre írtam hogy a pont is elhagyható ha direkt elérést adunk meg.
    ő de szerintem ezt ahogy írtad ez nem szabályos
    ../../ – két mappával megy feljebb
    de lehet hogy én nem tudom jól.

  40. mareszkukac says:

    Igen a direkt elérés is jó egyébkénk én mindenhol használom szinte a ../../ – t
    és még sehol nem volt vele gondom.

  41. gyuri says:

    Ja bocsi el is felejtettem feltenni egy számomra nagy kérdést.
    Ugyebár vannak azok a robotok vagy mik amik a captcha gyengeségét kihasználva bejutnak az oldalra na ezt az egészet nem értem.Ez úgy működik ? hogy a robot letapogatja a captchába lévő képben e betűket? és így jut át rajta? Vagy hogy zajlik ez az egész?
    Köszi a választ.

  42. mareszkukac says:

    Igen. Hasonlóan vagy pontosan úgy működnek mint a karakterfelismerős szkennerek.

  43. gyuri says:

    Értem köszönöm a válaszod.

  44. oszy says:

    Sziasztok!

    Szeretnék segítséget kérni. Van egy weboldalunk, de a készítője nem hajlandó segíteni, én meg nem értek annyira hozzá. Egy captcha-t kellene “beleépíteni” az üzenőfalba, mert megtalált egy robot :( Televágja az üzenőfalat baromságokkal!

    Van valaki aki tudna nekem segíteni?

    Előre is köszönöm!

  45. Sajnos nekem sem jelenik meg a kép. Se szerver oldalon, sem localon. Nincs imagettftext() támogatás? Lehet ez? Mi a teendő?

  46. Ppicur says:

    Sziasztok!
    Kipróbáltam a captcha-t. Localhoston tökéletes. Éles tárhelyen kellett az a kis változtatás, amit mareszkukac írt. Köszönet érte. :-)
    Az éles tárhelyen a captcha.php tökéletesen megcsinálja, kiteszi a képet és frissítésre megváltoztatja de a $_SESSION[“captcha”] valahonnan felvesz egy értéket és az nem változik meg, (kiíratom a form.php-ban, ott látom) így a form.php-ban az ellenőrzés minden esetben a hibás ágra ugrik.
    Lehet a hiba oka, hogy Joomla rendszerbe akartam beültetni?

  47. Ppicur says:

    Kovács Gábor:

    Ha látom a forrást, akkor van esély a segítségre! :-)

  48. Kyle says:

    kód elejére:
    putenv(‘GDFONTPATH=’.realpath(‘.’));

    vagy segítség lehet még:
    http://www.white-hat-web-design.co.uk/blog/php-captcha-security-images-help/

  49. Roxy says:

    Szia. Köszönetet szeretnék mondani. egyszerű jól elmagyaráztad :)
    Köszi

  50. AirSoftFun says:

    Hogy lehetne azt megoldani (iframe nélkül), hogy ha valaki nem tudja elolvasni kódot, akkor tudja frissíteni, de a már begépelt dolgok ne vesszenek el?

Szólj hozzá
a Egyszerű PHP CAPTCHA készítése c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>