[PHP] Captcha erster Wert immer falsch

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Buzzer, 5. September 2012 .

Schlagworte:
  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);
    
    ?>
     
  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.
  3. 7. September 2012
    AW: Captcha erster Wert immer falsch

    Erstell eine test.php mit folgenden Code:

    PHP:
    <? PHP
    session_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.
  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.
  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.
     
  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.
     
  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.

    Bild

    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&uuml;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  $t ;
            
    $a  pow ( $t1 3 );
            
    $b  $t  pow ( $t1 2 );
            
    $c  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 );

    if( 
    function_exists 'imageantialias'  ) ) {
        
    imageantialias $bild true  );
    }

    if( 
    function_exists 'imagealphablending'  ) ) {
        
    imagealphablending $bild true  );
    }

    imagesetthickness $bild );

    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 );

     
  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.
  9. 11. September 2012
    AW: Captcha erster Wert immer falsch

    Werd es morgen probieren, aber mich würde auch interessieren wo das Problem lag.
     
  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.
  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.
     
  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.
  13. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.