#1 5. September 2012 Captcha erster Wert immer falsch Hallo Leute ich habe ein Problem, und finde den Fehler nicht. Ich erzeuge eine Array, welche ich mixe, die 5 ersten Zeichen rausziehe und dann daraus ein Bild erzeuge. Außerdem wird die Zeichenkette per Session übergeben. Aber wenn man die Seite das erstmal aufruft, ist immer ein anderer Wert in der Session als auf dem Bild. Erst wenn man einmal auf aktualisieren geklickt hat stimmen Bild und Session überein. Irgendwo habe ich im Ablauf einen Fehler drin, aber ich finde ihn nicht. Anbei der Code: Code: <?php SESSION_START(); // Alten CAPTCHA-Code aus der Session loeschen unset( $_SESSION["captcha"] ); // Das Cachen der Grafik verhindern header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" ); header( "Cache-Control: no-store, no-cache, must-revalidate" ); header( "Cache-Control: post-check=0, pre-check=0", false ); header( "Pragma: no-cache" ); Header ("Content-type: image/png"); // Die Zeichen in einem Array $text[] = "2"; $text[] = "4"; $text[] = "5"; $text[] = "7"; $text[] = "8"; $text[] = "A"; $text[] = "B"; $text[] = "C"; $text[] = "D"; $text[] = "E"; $text[] = "F"; $text[] = "G"; $text[] = "H"; $text[] = "J"; $text[] = "K"; $text[] = "M"; $text[] = "N"; $text[] = "P"; $text[] = "Q"; $text[] = "R"; $text[] = "S"; $text[] = "T"; $text[] = "U"; $text[] = "V"; $text[] = "W"; $text[] = "X"; $text[] = "Y"; $text[] = "Z"; //Array mischen shuffle ( $text ); //die ersten 5 Zeichen in eine Variable $outputtext = array_slice ($text, 0, 5); //Variable an Session übergeben $_SESSION["captcha"] = implode($outputtext); // Laden der Rohdatei, die sich im Verzeichnis befinden muss $bild = ImageCreateFromPNG ("images/captcha.logo1.png"); // Farben definieren $farbe_w = ImageColorAllocate ($bild, 255, 255, 255); $farbe_b = ImageColorAllocate ($bild, 0, 0, 0); // Parameter für das Bild festlegen // Aufbau: // Schriftgröße, Winkel, X-Pos., Y-Pos, Farbe, Schrift, Inhalt ImageTTFText ($bild, 32, -30, 224, 112, $farbe_w, "arial.ttf", $outputtext[0]); ImageTTFText ($bild, 32, -90, 288, 208, $farbe_w, "arial.ttf", $outputtext[1]); ImageTTFText ($bild, 32, 0, 208, 336, $farbe_w, "arial.ttf", $outputtext[2]); ImageTTFText ($bild, 32, 45, 128, 304, $farbe_w, "arial.ttf", $outputtext[3]); ImageTTFText ($bild, 32, 99, 128, 192, $farbe_w, "arial.ttf", $outputtext[4]); // Ausgabe im Format PNG ImagePng ($bild); // Resourcen wieder freigeben ImageDestroy ($bild); ?> + Multi-Zitat Zitieren
#2 7. September 2012 AW: Captcha erster Wert immer falsch auf den ersten blick kann ich nichts erkennen. kannst du noch den quellcode schicken, mit dem du die eingaben prüfst? wie ist deine action von dem formular? kann es sein das du das bild nach dem post ein erneutes mal aufrufst und daher ein neuer code generiert wird? gruß 1 Person gefällt das. + Multi-Zitat Zitieren
#3 7. September 2012 AW: Captcha erster Wert immer falsch Erstell eine test.php mit folgenden Code: PHP: <? PHPsession_start (); echo 'Captcha: ' . $_SESSION [ 'captcha' ]; Wenn du die Datei erstellt hast rufst du dein Formular mit dem Captcha-Bild auf und danach in einem Zweiten Fenster die test.php Sind die Captcha-Codes gleich? 1 Person gefällt das. + Multi-Zitat Zitieren
#4 8. September 2012 Zuletzt bearbeitet: 8. September 2012 AW: Captcha erster Wert immer falsch versuch die ganzen header mal weiter nach unten zu verlegen. kann gut sein, dass dieses no-chache gedöns die session in irgendeiner weise beeinträchtigt. man weiß ja nie. also diesen teil: Code: // Das Cachen der Grafik verhindern header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" ); header( "Cache-Control: no-store, no-cache, must-revalidate" ); header( "Cache-Control: post-check=0, pre-check=0", false ); header( "Pragma: no-cache" ); Header ("Content-type: image/png"); runter zu: Code: // HIER HIN! // Ausgabe im Format PNG ImagePng ($bild); und sobald du den code in der session gespeichert hast session_write_close() aufrufen: Code: //Variable an Session übergeben $_SESSION["captcha"] = implode($outputtext); session_write_close(); 1 Person gefällt das. + Multi-Zitat Zitieren
#5 10. September 2012 Zuletzt bearbeitet: 10. September 2012 AW: Captcha erster Wert immer falsch Hey Danke Leute, ich habe jetzt die Datei so umgebaut wie Murdoc meinte, aber keine Besserung. Ich habe auch die tst.php erstellt. Wenn ich nur die captchaimage.php siehe oben und die test.php aufrufe, dann stimmen die Codes überein. Rufe ich aber die captcha.php das erste mal auf(siehe unten angehängten code) und dann die test.php, bekomme ich nur den Wert der in der letzten Session geschrieben war(bzw. keinen Wert also leer). Erst wenn ich die captcha.php einmal aktualisiert habe oder einen falschen Code eingegeben habe, ist der Wert in der Session korrekt. Der zeitliche Ablauffehler muss also in der Datei sein in der ich die Abfrage mache. Code: <?php // Session starten SESSION_START(); // Formular wurde abgeschickt if ($_SERVER['REQUEST_METHOD'] == 'POST') { //echo "Captcha ist: ".$_SESSION['captcha']; //echo " Sicherheitscode ist: ".$_POST['sicherheiscode']; // Felder auf Inhalt pruefen if ( md5($_SESSION["captcha"]) == md5($_POST["sicherheitscode"])) { $Fehlerfrei = TRUE; $_SESSION["captchaErfolgreich"] = $Fehlerfrei; header("Location:" .$_SESSION["aktuelleSeite"]); exit; }else { echo "<h2>Der Sicherheitscode ist nicht korrekt!</h2>"; $Fehlerfrei = FALSE; $_SESSION["captchaErfolgreich"] = $Fehlerfrei; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Sicherheitsabfrage</title> </head> <body> <form id="captchatest" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <fieldset> <legend>Sicherheitsabfrage</legend> <img src="captchaimage.php" alt="Sicherheitscode" title="Sicherheitscode" /><br> <label for="sicherheitscode"><?php echo $CaptchaFehler ? '<span style="color: #FF0000;">Bitte Sicherheitscode eingeben:</span>' : 'Bitte Sicherheitscode eingeben:'; ?></label> <input name="sicherheitscode" id="sicherheitscode" type="text" /> <input name="senden" id="senden" type="submit" value="Absenden" class="button" /> </fieldset> </form> </body> </html> Als erstes dachte ich es läge daran das ich erst die php Methode aufrufe und erst danach im html code die captchaimage.php aufrufe. Ich habe dann versucht, in der Datei erst den html Code und dann den php Teil zu schreiben, aber das brachte auch nichts. Ich steh gewaltig aufm Schlauch hab ichs Gefühl. + Multi-Zitat Zitieren
#6 11. September 2012 AW: Captcha erster Wert immer falsch Also ich habe das ganze jetzt anders aufgebaut und die Reihenfolge geändert. Jetzt klappt es Aufbau wie folgt: captcha.php Hier wird erst der Code erzeugt und dann an die Session übergeben. Danach wird im html Teil die captchaimage.php als Bild aufgerufen. Code: <?php error_reporting(-1); ini_set('display_errors', 1); // Session starten SESSION_START(); // Alten CAPTCHA-Code aus der Session loeschen unset( $_SESSION["captcha"] ); // Die Zeichen in einem Array $text[] = "2"; $text[] = "4"; $text[] = "5"; $text[] = "7"; $text[] = "8"; $text[] = "A"; $text[] = "B"; $text[] = "C"; $text[] = "D"; $text[] = "E"; $text[] = "F"; $text[] = "G"; $text[] = "H"; $text[] = "J"; $text[] = "K"; $text[] = "M"; $text[] = "N"; $text[] = "P"; $text[] = "Q"; $text[] = "R"; $text[] = "S"; $text[] = "T"; $text[] = "U"; $text[] = "V"; $text[] = "W"; $text[] = "X"; $text[] = "Y"; $text[] = "Z"; //Array mischen shuffle ( $text ); //die ersten 5 Zeichen in eine Variable $outputtext = array_slice ($text, 0, 5); //Variable an Session übergeben $_SESSION["captcha"] = implode($outputtext); session_write_close(); echo "Captcha ist: ".$_SESSION["captcha"]; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <img src="captchaimage.php" alt="" style="vertical-align: middle;"> </html> captchaimage.php Hier wird der Wert aus der Session übernommen und aus ihm ein Bild generiert. Code: <?php error_reporting(-1); ini_set('display_errors', 1); SESSION_START(); Header ("Content-type: image/png"); $str = $_SESSION["captcha"]; // Laden der Rohdatei, die sich im Verzeichnis befinden muss $bild = ImageCreateFromPNG ("http://www.php.de/images/captcha.logo1.png"); // Farben definieren $farbe_w = ImageColorAllocate ($bild, 255, 255, 255); $farbe_b = ImageColorAllocate ($bild, 0, 0, 0); // Parameter für das Bild festlegen // Aufbau: // Schriftgröße, Winkel, X-Pos., Y-Pos, Farbe, Schrift, Inhalt ImageTTFText ($bild, 32, -30, 224, 112, $farbe_w, "arial.ttf", $str[0]); ImageTTFText ($bild, 32, -90, 288, 208, $farbe_w, "arial.ttf", $str[1]); ImageTTFText ($bild, 32, 0, 208, 336, $farbe_w, "arial.ttf", $str[2]); ImageTTFText ($bild, 32, 45, 128, 304, $farbe_w, "arial.ttf", $str[3]); ImageTTFText ($bild, 32, 99, 128, 192, $farbe_w, "arial.ttf", $str[4]); // Das Cachen der Grafik verhindern header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" ); header( "Cache-Control: no-store, no-cache, must-revalidate" ); header( "Cache-Control: post-check=0, pre-check=0", false ); header( "Pragma: no-cache" ); // Ausgabe im Format PNG ImagePng ($bild); // Resourcen wieder freigeben ImageDestroy ($bild); ?> Wirklich seltsam ist aber folgendes Problem: Wenn ich in der captcha.php die Zeile echo "Captcha ist: ".$_SESSION["captcha"]; auskommentiere(diente ja nur zur überprüfung) wird das Bild zwar erzeugt, aber ohne die Zeichen. Also im Grunde ist das Bild leer. 1. Warum verändert die Echo Ausgabe den Inhalt der Session? 2. Wenn garkeine Zeichen in der Session vorhanden wären, würde es eig auch kein Bild erstellen, es muss also was da sein. + Multi-Zitat Zitieren
#7 11. September 2012 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Captcha erster Wert immer falsch Habe dein Script Modifiziert so das es Funktioniert. Habe es auch gleich noch so verändert das die Zeichen nicht immer auf der Exakt selben stelle stehen und das eine Kurvenlinie zufällig hindurch gezeichnet wird, frag mich nicht warum ich letzteres hinzugefügt habe ?( Im Verzeichnis der captchaimage.php muss die Schriftart Arial als arial.ttf liegen. index.php PHP: <? php session_start (); $_SESSION [ 'captchaCheck' ] = 0 ; $captchaCheck = null ; if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' ) { $captchaCheck = false ; if( $_SESSION [ 'captcha' ] === $_POST [ 'captcha' ] ) { $_SESSION [ 'captchaCheck' ] = 1 ; $captchaCheck = true ; // Eine Umleitung auf eine Geschützte Seite wäre hier auch möglich. // Die Session-Variable captchaCheck kann dort geprüft werden. echo '<!doctype html><html><head><meta charset="utf-8"><title>Captcha Korrekt</title></head><body><h1>Captcha Korrekt</h1><p>Die Captcha-Eingabe war korrekt. Zurück zur <a href="index.php?reset">Captcha Eingabe</a></body></html>' ; exit; } } ?><!doctype html> <html> <head> <meta charset="utf-8"> <title>Captcha Eingabe</title> </head> <body> <form id="captchatest" action="<?php echo $_SERVER [ 'PHP_SELF' ]; ?>" method="post"> <fieldset> <legend>Captcha Eingabe</legend> <div> <img src="captchaimage.php?_=<?PHP echo time (); ?>" alt="Captcha" title="Captcha" /> </div> <div> <label for="captcha">Zahlen und Buchstaben hier eintragen: </label> <input type="text" name="captcha" id="captcha" /> <button type="submit">Abschicken</button> </div> </fieldset> </form> </body> </html> captchaimage.php PHP: <? php session_start (); // Alten CAPTCHA-Code aus der Session loeschen $_SESSION [ 'captchaCheck' ] = 0 ; unset( $_SESSION [ 'captcha' ] ); // Das Cachen der Grafik verhindern header ( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); header ( "Last-Modified: " . gmdate ( "D, d M Y H:i:s" ) . " GMT" ); header ( "Cache-Control: no-store, no-cache, must-revalidate" ); header ( "Cache-Control: post-check=0, pre-check=0" , false ); header ( "Pragma: no-cache" ); Header ( "Content-type: image/png" ); // Die Zeichen in einem Array $text [] = "2" ; $text [] = "4" ; $text [] = "5" ; $text [] = "7" ; $text [] = "8" ; $text [] = "A" ; $text [] = "B" ; $text [] = "C" ; $text [] = "D" ; $text [] = "E" ; $text [] = "F" ; $text [] = "G" ; $text [] = "H" ; $text [] = "J" ; $text [] = "K" ; $text [] = "M" ; $text [] = "N" ; $text [] = "P" ; $text [] = "Q" ; $text [] = "R" ; $text [] = "S" ; $text [] = "T" ; $text [] = "U" ; $text [] = "V" ; $text [] = "W" ; $text [] = "X" ; $text [] = "Y" ; $text [] = "Z" ; //Array mischen shuffle ( $text ); //die ersten 5 Zeichen in eine Variable $outputtext = array_slice ( $text , 0 , 5 ); //Variable an Session übergeben $_SESSION [ "captcha" ] = implode ( $outputtext ); // http://rosettacode.org/wiki/Bitmap/B%C3%A9zier_curves/Cubic#PHP function imageCubicbezier ( $img , $col , $x0 , $y0 , $x1 , $y1 , $x2 , $y2 , $x3 , $y3 , $n = 20 ) { $pts = array(); for( $i = 0 ; $i <= $n ; $i ++) { $t = $i / $n ; $t1 = 1 - $t ; $a = pow ( $t1 , 3 ); $b = 3 * $t * pow ( $t1 , 2 ); $c = 3 * pow ( $t , 2 ) * $t1 ; $d = pow ( $t , 3 ); $x = round ( $a * $x0 + $b * $x1 + $c * $x2 + $d * $x3 ); $y = round ( $a * $y0 + $b * $y1 + $c * $y2 + $d * $y3 ); $pts [ $i ] = array( $x , $y ); } for( $i = 0 ; $i < $n ; $i ++) { imageline ( $img , $pts [ $i ][ 0 ], $pts [ $i ][ 1 ], $pts [ $i + 1 ][ 0 ], $pts [ $i + 1 ][ 1 ], $col ); } } $captchaWidth = 200 ; $captchaHeight = 100 ; $bild = imageCreateTrueColor ( $captchaWidth , $captchaHeight ); $backgroundColor = imageColorAllocate ( $bild , 255 , 255 , 255 ); imageFill ( $bild , 0 , 0 , $backgroundColor ); $lineColor = imageColorAllocate ( $bild , 0 , 0 , 0 ); if( function_exists ( 'imageantialias' ) ) { imageantialias ( $bild , true ); } if( function_exists ( 'imagealphablending' ) ) { imagealphablending ( $bild , true ); } imagesetthickness ( $bild , 2 ); imageCubicbezier ( $bild , $lineColor , rand ( 5 , 30 ), rand ( 20 , 70 ), rand ( 50 , 80 ), rand ( 20 , 70 ), rand ( 80 , 130 ), rand ( 20 , 70 ), rand ( 130 , 190 ), rand ( 20 , 70 ), 40 ); $charSize = 28 ; $charPositionX = 20 ; $charPositionY = 50 ; $charRandOffsetMinX = - 8 ; $charRandOffsetMaxX = 8 ; $charRandOffsetMinY = - 8 ; $charRandOffsetMaxY = 8 ; $charOffsetX = 32 ; $charOffsetY = 0 ; $charFont = './arial.ttf' ; $charColor = imageColorAllocate ( $bild , 20 , 20 , 20 ); $charAngleMin = - 30 ; $charAngleMax = 30 ; for( $a = 0 , $b = count ( $outputtext ); $a < $b ; ++ $a ) { $charAngle = rand ( $charAngleMin , $charAngleMax ); $charRandOffsetX = rand ( $charRandOffsetMinX , $charRandOffsetMaxX ); $charRandOffsetY = rand ( $charRandOffsetMinY , $charRandOffsetMaxY ); imagettftext ( $bild , $charSize , $charAngle , $charPositionX + $charRandOffsetX , $charPositionY + $charRandOffsetY , $charColor , $charFont , $outputtext [ $a ] ); $charPositionX += $charOffsetX ; $charPositionY += $charOffsetY ; } // Ausgabe im Format PNG ImagePng ( $bild ); // Resourcen wieder freigeben ImageDestroy ( $bild ); + Multi-Zitat Zitieren
#8 11. September 2012 AW: Captcha erster Wert immer falsch Und woran lag es im Endeffekt? Würde mich mal interessieren... 1 Person gefällt das. + Multi-Zitat Zitieren
#9 11. September 2012 AW: Captcha erster Wert immer falsch Werd es morgen probieren, aber mich würde auch interessieren wo das Problem lag. + Multi-Zitat Zitieren
#10 12. September 2012 Zuletzt bearbeitet: 12. September 2012 AW: Captcha erster Wert immer falsch Durch das echo wird ein flush der Ausgabe erzwungen. Ich kann mir vorstellen das es daran liegt. Nanobyte hat das schließende ?> php Tag nicht, was auch ab php5 empfohlen wird. Hier wird denke ich auch explizit ein flush der Ausgabe erzwungen. Eine Session kann auch nur vor einer Ausgabe gestartet werden. Wird ein header oder sonstiges vor dem starten der Session gesendet funktioniert die Session nicht. 1 Person gefällt das. + Multi-Zitat Zitieren
#11 12. September 2012 AW: Captcha erster Wert immer falsch Das stimmt nicht ganz. Echo oder Print erzeugt eigenständig keinen flush (ausgenommen im CLI Modus). Da kommt es immer auf die PHP-Konfiguration an. Eher nicht, da die Session bereits gestartet wurde. Sobald session_start() erfolgreich war kannst du soviel Daten ausgeben wie du lustig bist. Nein, das weglassen von "?>" erzeugt keinen flush. Im Gegenteil, damit wird verhindert das ein ungewollter flush aufgrund von Leerzeichen/Zeilen auftritt. -------- Im Großen und Ganzen ist mir auch nicht klar was nun der Fehler war. + Multi-Zitat Zitieren
#12 12. September 2012 AW: Captcha erster Wert immer falsch Also das Script von nano funktioniert wunderbar. Danke dafür. Auch an alle anderen vielen Dank. BW´s sind raus 1 Person gefällt das. + Multi-Zitat Zitieren