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