Hallo Forum...
als silent-reader hab ich mir hier in der Vergangenheit schon die eine oder andere nützliche Info abholen können... allerdings jetzt ein
Problem/Phänomen mit dem ich (einschließlich Suchfunktion) nicht weiter komme.
Aufgabenstellung:
Ich habe ein Mail-Formular gebaut. Um es gegen mail-injection u.ä. ein bischen abzusichern, habe ich neben der Validierung der
eingegebenen Daten eine Funktionalität vorgesehen, die ein mehrfaches Senden der Daten einigermaßen verhindern soll.
Grundaufbau (ich beschränke mich auf die aus meiner Sicht wichtigen Teile des Scripts, wenn da aus Eurer Sicht was fehlen sollte, bitte
Nachsicht üben):
PHP-Code:
3 if (isset($_POST['stage']) && ($_POST['stage'] == 'process'))
4 {
5 val_form();
6 }
7 else
8 {
9 show_form();
...
13 function show_form()
14 {
15 $form_id = md5 (uniqid (rand()));
16 echo " <div id=\"con-box\">\n";
17 echo " <h1>Eröffnungsdialog via Mail</h1>\n";
18 echo "$form_id";
... ## Ausgabe $form_id an dieser Stelle nur zur Kontrolle, Erklärung weiter unten
26 echo " <form action=\"index.php?id=711-1\" method=\"post\">\n";
...
43 echo " <input name=\"form_id\" type=\"hidden\" value=\"".$form_id."\">\n";
44 echo " <input name=\"stage\" type=\"hidden\" value=\"process\">\n";
...
55 exit;
56 }
...
59 function val_form()
60 {
61 $data_out = array();
62 $msg_err_anz = 0;
63 $dir_tmp = "/xampp/htdocs/dc/tmp/";
64 $wHandle = fopen ($dir_tmp."form_id_tmp.txt", 'r+');
65 $rHandle = fopen ($dir_tmp."form_id_tmp.txt", 'r');
66 $name = $_POST['name'];
67 $firma = $_POST['firma'];
68 $e_mail = $_POST['e_mail'];
69 $nachricht = $_POST['nachricht'];
70 $form_id_post = $_POST['form_id'];
... ## Zeile 80 bis 118 Datenvalidierung
123 if ($msg_err_anz == "0")
124 {
125 $tmp_form_id = fgets($rHandle);
126
127 if ($tmp_form_id == $form_id_post)
128 {
... ## Formular wurde bereits gesendet, Abbruch
143 fclose ($rHandle);
144 exit;
145 }
146 else
147 {
148 if (!fwrite($wHandle, $form_id_post))
149 {
150 print "Kann in die Datei $filename nicht schreiben";
151 exit;
152 }
153 fclose ($wHandle);
154 }
... ## Formular wurde gesendet
... ## bei fehlerhaften Eingaben, Ausgabe des Formulars mit Fehlermeldung
195 if (is_array($data_out))
196 {
197 foreach ($data_out as $feld => $msg)
198 {
199 foreach ($msg as $msg_code => $value)
200 {
... ## die ursprüngliche Formular-ID wird mit übergeben
283 echo " <input name=\"form_id\" type=\"hidden\" value=\"".$form_id_post."\">\n";
... ## nach dem erneuten "Senden" geht's in Zeile 59 wieder los, solange, bis keine
## Fehler mehr enthalten sind und das Mail-Formular richtig gesendet wird.
Das Problem/Phänomen:
Mit dem IE funktioniert alles bestens, egal, ob reload oder Zurück-Button, das Script erkennt, wenn das Mail-Formular schon einmal
geschickt wurde und gibt die entsprechende Meldung aus - kein erneuter Versand. Dass es beim IE klappt, hat aber erfahrungsgemäß
nicht viel zu bedeuten.
Mozilla 5.0:
In Zeile 18 gebe ich die Formular-ID zur Kontrolle aus. Der angezeite String stimmt nicht mit dem im Quellcode überein - aktuell:
Ausgabe: beaa9370fcaca415cc460ce25fc572c6
Quellcode: aba2bd8694973ec3ab836201441a18f9
Ich fülle nun alle Felder korrekt aus und sende es. Die Fehlerprüfung Zeile 80 bis 118 ergibt 0 - das Formular wird gesendet und die ID
(Ausgabe-ID) temporär gespeichert, Zeile 148 bis 153.
Klicke ich jetzt Reload, ist alles gut: ab Zeile 125 wird geprüft und erkannt, dass das Formular bereits gesendet wurde und ein erneutes
Senden verhindert.
Klicke ich den Zurück-Button, erscheint das ursprüngliche Formular mit den eingegebenen Daten, allerding hat sich die Formular-ID
geändert. Das führt daszu, dass beim erneuten Senden angenommen wird, dass es sich um eine neue Mail handelt - der Versand findet statt.
Erstaunlich:
Fülle ich nach dem ersten Aufruf das Formular n i c h t korrekt aus, bekomme ich es mit den entsprechenden Fehlermeldungen zurück.
Ich korrigiere, sende erneut, drücke den Reload-Button - der Versand wird verhindert, drücke dann den Zurück-Button und sende
erneut - der Versand wird verhindert, schaue mir jeweils die Quellcodes an und stelle fest, dass die ursprüngliche Formular-ID in jedem
Fall korrekt verarbeitet wurde und sich nicht ändert...
Zur Info,
Test-Browser: Mozilla/5.0 (Windows; U; Windows NT 5.1; de-AT; rv:1.6) Gecko/20040113, das automatische Speichern von Formulardaten
findet nicht statt.
Bevor ich die Idee mit uniqid() verwerfe und mit Session/SID arbeite, wollte ich sicher sein, dass ich nicht irdendwo eine Dämlchkeit
gebaut habe...
Danke schonmal für Eure Hilfe
dicon