Chrome/Safari liefern andere Zahlen via AJAX-Prüfung?!

Hier werden Probleme rund um das Rechen Captcha behandelt

Moderator: frameguard

Chrome/Safari liefern andere Zahlen via AJAX-Prüfung?!

Beitragvon ben8o » 16.05.2011, 12:53

Hallo Gemeinde,

ich hoffe auf eure Mithilfe! Erst beschreibe ich, was ich mache, unten gibt es dann den Code.

Auf meiner Website benötige ich drei (unterschiedliche) Captchas gleichzeitig. Diese lasse ich beim Seitenaufruf durch das Script generieren und alles in die derzeitige Session schreiben. Die Bildgenerierung greift dann später auf diese Sessiondaten zurück. Die Überprüfung erfolgt mittels AJAX (jquery) und der dadurch "natürlich" externen PHP-Datei.

Jetzt das Phänomen:
Im Firefox 3 und (sogar!) im Internet Explorer 9 läuft alles einwandfrei. Korrekte Fehlererkennung oder eben korrekte Speicherung der Formulardaten. Im Chrome 11 und im Safari 5 passiert etwas sonderbares. Der var_dump der Session liefert anfangs die korrekten Werte, aber sobald die externe PHP-Datei die Session öffnet, spuckt der var_dump ANDERE Werte aus! Wohlgemerkt nur im Chrome als auch im Safari. Das heißt also eigentlich, dass bei BEI DER PRÜFUNG neue Captcha-Zahlen generiert werden – und zwar beim session_start befehl! Die Session-ID bleibt gleich.

So. Jetzt ihr! Woran kann das liegen, dass sobald die Session im externen php script gestartet wird, neue zahlen generiert werden??? Total paradox. Vorallem, weil es in den anderen beiden Browsern ja läuft! Oder liegt es an was ganz anderem???

Hier die Codes:

INDEX.PHP
Code: Alles auswählen
<?php
   session_start();
   require_once("udw_main.php");
   generate_captcha();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de-DE">
..... usw


AUFRUF DES BILDES IN DER INDEX.PHP
Code: Alles auswählen
<img src="udw_captcha.php?id=1" />

Die ID beschreibst, welche der drei nötigen Rechnungen gebraucht wird. Es gibt als 1, 2 und 3.

DIE udw_main.php DATEI
Code: Alles auswählen
function generate_captcha() {

   unset($_SESSION['captcha1']);
   unset($_SESSION['captcha2']);
   unset($_SESSION['captcha3']);

   $schluessel = "###KEY###";
      
   $zahl1 = rand(10,20); //Erste Zahl 10-20
   $zahl2 = rand(1,10);  //Zweite Zahl 1-10
   $zahl3 = rand(10,20); //Erste Zahl 10-20
   $zahl4 = rand(1,10);  //Zweite Zahl 1-10
   $zahl5 = rand(10,20); //Erste Zahl 10-20
   $zahl6 = rand(1,10);  //Zweite Zahl 1-10
   $operator = rand(1,2); // + oder -
   
   if($operator == "1"){
      $operatorzeichen = " + ";
      $ergebnis1 = $zahl1 + $zahl2;
      $ergebnis2 = $zahl3 + $zahl4;
      $ergebnis3 = $zahl5 + $zahl6;
        }else{
      $operatorzeichen = " - ";
      $ergebnis1 = $zahl1 - $zahl2;
      $ergebnis2 = $zahl3 - $zahl4;
      $ergebnis3 = $zahl5 - $zahl6;
    }

   function encrypt($string, $key) {
      $result = '';
      for($i=0; $i<strlen($string); $i++) {
         $char = substr($string, $i, 1);
         $keychar = substr($key, ($i % strlen($key))-1, 1);
         $char = chr(ord($char)+ord($keychar));
         $result.=$char;
      }
      return base64_encode($result);
   }

   
   $_SESSION['zahl1'] = $zahl1;
   $_SESSION['zahl2'] = $zahl2;
   $_SESSION['zahl3'] = $zahl3;
   $_SESSION['zahl4'] = $zahl4;
   $_SESSION['zahl5'] = $zahl5;
   $_SESSION['zahl6'] = $zahl6;
   $_SESSION['operatorzeichen'] = $operatorzeichen;
   
   $_SESSION['captcha1'] = encrypt($ergebnis1, $schluessel);
   $_SESSION['captcha1'] = str_replace("=", "", $_SESSION['captcha1']);
   
   $_SESSION['captcha2'] = encrypt($ergebnis2, $schluessel);
   $_SESSION['captcha2'] = str_replace("=", "", $_SESSION['captcha2']);

   $_SESSION['captcha3'] = encrypt($ergebnis3, $schluessel);
   $_SESSION['captcha3'] = str_replace("=", "", $_SESSION['captcha3']);

}


Mir ist klar, dass man vieles mit Schleifen lösen kann - also bitte von "Dein Code is Dreck" Kommentaren absehen. Ich muss hier jeden Schritt prüfen bei dem beschriebenen Phänomen :wink:



AJAX AUFRUF (JQUERY) DER AUSGELAGERTEN JAVASCRIPT-DATEI
Code: Alles auswählen
   function put_kommentar() {

      var text     = document.neuerkommentar_form.neuerkommentar_text.value;
      var name     = document.neuerkommentar_form.neuerkommentar_name.value;
      var thema_id = document.neuerkommentar_form.neuerkommentar_themaID.value;
      var captcha  = document.neuerkommentar_form.neuerkommentar_captcha.value;
         
      $.ajax({
         type: "POST", 
         url: "speichern_kommentar.php",
         data: "thID=" + thema_id + "&text=" + text + "&name=" + name + "&captcha=" + captcha, 
         
         success: function(phpData){ 
            document.getElementById('ajaxdiv').innerHTML = phpData; 
         } 
      });
   }


DIE KONTROLLIERENDE SPEICHERN_KOMMENTAR.PHP DATEI
Code: Alles auswählen
<?php
   
   session_start();
   
   function encrypt($string, $key) {
      $result = '';
      for($i=0; $i<strlen($string); $i++) {
         $char = substr($string, $i, 1);
         $keychar = substr($key, ($i % strlen($key))-1, 1);
         $char = chr(ord($char)+ord($keychar));
         $result.=$char;
      }
      return base64_encode($result);
   }

   
   $sicherheits_eingabe = encrypt($_POST['captcha'], "[i]###KEY###[/i]");
   $sicherheits_eingabe = str_replace("=", "", $sicherheits_eingabe);
   
   if(isset($_SESSION['captcha1']) AND $sicherheits_eingabe == $_SESSION['captcha1']){
      unset($_SESSION['captcha1']);

      // -------------------- Kommentar speichern und anzeigen

      require_once("udw_main.php");
      sqlconnect();

      $thID = $_POST['thID'];
      $text = mysql_real_escape_string($_POST['text']);
      $name = mysql_real_escape_string($_POST['name']);
      
      mysql_query("SET NAMES 'utf8'");
      mysql_query("INSERT INTO kommentare (thema_id, kommentar_text, kommentar_name) VALUES ('$thID','$text','$name')");
      
      ?>

         <div id="newcomment" class="comment">      
            <?php echo $thID.", ".$text.", ".$name."<br />"; ?>
            <span class="comment_author"><?=$_POST['name']; ?></span><br>
            <span class="comment_text"><?=$_POST['text']; ?></span>
         </div>
                  
   <?php }else{  /* wenn das captcha falsch ist, wird folgendes ausgeführt: */  ?>

         <div id="errorbox">
<strong>Die Rechenaufgabe ist nicht korrekt.</strong><br />Bitte gib das korrekte Ergebnis ein.<br />Dies ist leider nötig, damit sich keine sogenannten Roboter<br />in die Kommentare eintragen können.</p><p><a href="javascript:show('neuerkommentarwrapper');">Zurück zum Formular</a></p>
         </div>
      
<?php } ?>


Also wenn mir iiiirgendwer helfen kann, dann bitte. Ich hoffe auch, dass euch dieser Code reicht, weil den KOMPLETTEN Code (wie gewünscht) wäre beim Projektumfang etwas viel ;)
ben8o
 
Beiträge: 2
Registriert: 16.05.2011, 12:22

Re: Chrome/Safari liefern andere Zahlen via AJAX-Prüfung?!

Beitragvon ben8o » 16.05.2011, 15:41

Thread kann geschlossen werden.

Das Problem lag an einem (1) img-Tag welches keine src hatte. -.- Chrome und Safari interpretieren das als Aufruf auf sich selbst und führen diverse scripte nochmal aus, während einige Teile der Seite schon gerendert sind.

Also Lösung gefunden. Code in Ordnung.
ben8o
 
Beiträge: 2
Registriert: 16.05.2011, 12:22


Zurück zu Rechen Captcha

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron