ilch Forum » Allgemein » HTML, PHP, SQL,... » Captcha Problem

Geschlossen
  1. #1
    User Pic
    Son!c Hall Of Fame
    Registriert seit
    14.09.2006
    Beiträge
    3.766
    Beitragswertungen
    5 Beitragspunkte
    Hi zusammen,
    ich hab grad ein kleines Problem, dass ich vor längerer Zeit schonmal hatte, dort den Fehler auch selbst schnell gefunden habe, ich ihn aber jetzt nicht mehr finde und daher bräuchte ich nun mal ein paar Augen mehr.

    Es geht um eine Captcha Funktion die aus einem Array von Hintergrundbildern und einem Zufallsstring aus 5 Zeichen ein PNG Bild generiert und den Zufallsstring gleichzeitig in der SESSION speichert, um später kontrollieren zu können ob der Benutzer auch das richtige eingetippt hat.
    Mein Problem dabei ist nun, dass der Inhalt in der SESSION ein Seitenaufruf zu spät gesetzt wird. D.h. wenn man auf die Seite geht hat man in der SESSION noch keine Einträge, obwohl das Bild generiert wurde und "Text" drin steht. Aktuallisiert man die Seite, steht in der SESSION der "Text" des davor generierten Bildes drin, im Bild selber steht aber ein anderer "Text" usw.

    <?php
    session_start();
    header('Content-type: image/png');
    unset($_SESSION['captcha_spam']);
    
    function randomString($len) {
    	function make_seed(){
    		list($usec , $sec) = explode (' ', microtime());
    		return (float) $sec + ((float) $usec * 100000);
    	}
    	srand(make_seed());  
    			   
    	// Der String $possible enthält alle Zeichen, die verwendet werden sollen
    	$possible	= 'ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789';
    	$str		= '';
    	while(strlen($str)<$len) {
    		$str.=substr($possible,(rand()%(strlen($possible))),1);
    	}
    	return($str);
    }
    
    function get_captcha_imgs () {
    	$ar	= array();
    	$o	= opendir('../captcha/pics/');
    	while ($f = readdir($o) ) {
    		if ( $f != '.' AND $f != '..' ) {
    			$ar[] = '../captcha/pics/'.$f;
    		}
    	}
    	closedir($o);
    	return ($ar);
    }
    
    $text = randomString(5);									// Die Zahl bestimmt die Anzahl stellen
    
    $_SESSION['captcha_spam'] = $text;
    
    $picarray	= get_captcha_imgs();
    $count		= count($picarray);
    $key		= rand(1, $count-1);
    $ex			= explode(".",$picarray[$key]); 
    $img		= ImageCreateFromPNG($picarray[$key]);			// Backgroundimage
    $color		= ImageColorAllocate($img, 255, 255, 255);		// Farbe
    $ttf		= '../captcha/XFILES.TTF';						// Schriftart
    $ttfsize	= 25;											// Schriftgrösse
    $angle		= rand(0,5);
    $t_x		= rand(5,30);
    $t_y		= 35;
    
    imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $_SESSION['captcha_spam']);
    imagepng($img);
    imagedestroy($img); 
    ?>


    Danke schonmal für eure Mühe und Mithilfe! lächeln

    Gruß
    Sonic
    Nimm das Leben nicht zu ernst, du kommst sowieso nicht lebend raus.
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Naja ist ja normal, weil wenn du deine Seite also php aufrufst, wird das Bild ja nicht erzeugt, sondern erst später, wenn der Browser die Adresse für das Bild aufruft, um es anzuzeigen, dann wird es generiert und die Daten in die Session geschrieben, das sollte auch ausreichen, um die Eingabe kontrollieren zu können.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Son!c Hall Of Fame
    Registriert seit
    14.09.2006
    Beiträge
    3.766
    Beitragswertungen
    5 Beitragspunkte
    Das Ding ist ja aber, dass das nicht gleich in die Session geschrieben wird, sondern erst ein Seitenaufruf später wie ich schon oben beschrieben habe.

    Was mich allerdings auch gerade ein bisschen stuzig macht, ist das ja der Text aus der SESSION eigentlich in das Bild geschrieben wird.
    ZitatZitat
    imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $_SESSION['captcha_spam']);

    Aber der Text in der SESSION eigentlich gar nicht drin steht.
    Nimm das Leben nicht zu ernst, du kommst sowieso nicht lebend raus.
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten