Thread [php] Problem mit Formularfelderüberprüfung und UTF-8 (103 answers)
Opened by Tom at 2008-10-04 14:02

Gast Chris
 2010-11-07 00:42
#142517 #142517
Hallo,

jetzt füge ich noch einmal den kompletten Quelltext bei. Ich bin mit den PHP Schnipseln nicht zurecht gekommen. Weißt Du, was man im Quelltext ergänzen bzw. ändern muß, so das er funktioniert?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
//Gib Fehler und Warnungen aus
error_reporting(E_ALL);
//Deutschsprachige Umgebung, damit die
//regulären Ausdrücke auch Umlaute etc. erkennen
setlocale(LC_ALL, 'de_DE');
//Erzeuge einen zufällig aussehenden Zugangscode aus dem Datum ...
$code = chr((date("y") + 7) % 10 + date("m") + 68 + (date("m") % 2) * 32) . chr((date("d") + (date("d") %2)) / 2 + 66 + (37 * (date("d") %2)));
//... den der Anwender mittels verborgenem Eingabefeld übergibt.
//So lässt sich das Gros der skriptgesteuerten Angriffe von
//vornherein abblocken.
//Wurde das Formular abgeschickt?
//Falls ja: Daten prüfen und versenden
if(isset($_POST['los'])) {
if(!isset($_POST['code']) || $_POST['code'] != $code) die('Mailcode fehlt!');
//Liste der zu überprüfenden Formularfelder:
//'Absender' muss genau eine Mailadresse sein,
//'Betreff' ist ein mindestens drei Zeichen langer Text ohne Umbruch,
//'Text' muss zehn Zeichen lang sein.
$pruefung = array(
'Absender' => '/^ [\w.!#%&\*\/=\?\^\`\{\|\}\~+-]{1,64} \@
[[:alnum:].-]{1,255} \. [a-z]{2,6} $/xi',
//prüft auf gültige E-Mail-Adresse nach RFC 2822,
//erlaubt auch ungewöhnliche Adressen wie "{@heise.de";
//strengere Prüfung (erfordert z.B. mindestens 2 Zeichen vor @
//und im Domainnamen, schließt ungewöhnliche Adressen aus):
//'Absender' => '/^[\w.+-]{2,64}\@[\w.-]{2,255}\.[a-z]{2,6}$/',
'Betreff' => '/^[[:print:]]{3,}$/',
//restriktivere Variante:
//'Betreff' => '/^[[:alnum:]\s\?.!,;:\(\)\/\"-]{3,}$/',
'Text' => '/^[[:print:][:space:]]{10,}$/'
);
//Durchlaufe alle Formulardaten:
foreach($_POST as $parameter => $wert) {
//Formularfelder, die in $pruefung stehen,
//müssen in die oben definierten Muster passen
if(isset($pruefung[$parameter])) {
if(!preg_match($pruefung[$parameter], $wert)) die('Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);
} else {
//Der Rest wird weggeworfen.
unset($_POST[$parameter]);
}
}
//Prüfe, ob die Absenderadresse einem gültigen MX-Host angehört
//Zu jeder Domain in einer Mailadresse (nach dem @-Zeichen)
//sollte ein Mail Exchange Resource Record (MX-RR) im Domain Name
//System (DNS) eingetragen sein. Die MX-Hosts versenden die E-Mail
//per SMTP. getmxrr() schreibt MX-Hosts in das Array $mxhosts
//ACHTUNG: Dieser Befehl ist nur auf Unix-Maschinen implementiert,
//unter anderen Betriebssystemen ist die Zeile zu streichen!
//Außerdem scheint getmxrr() Probleme mit Umlautdomains zu haben.
if(!getmxrr(substr(strstr($_POST['Absender'], '@'), 1), $mxhosts)) die("Konnte keine gültige Domain für " . $_POST['Absender'] . " finden!");
//Die Formulardaten sind ok -- der Mailversand wird vorbereitet:
//mail() erwartet Empfänger, Betreff, Text und weitere Kopfdaten
if(mail('email@homepage.de', $_POST['Betreff'], $_POST['Text'], "From:" . $_POST['Absender'])) {
//Es hat geklappt: Bestätigung ausgeben
echo "<p>Nachricht von " . $_POST['Absender'] . " an homepage.de gesendet!</p>";
} else {
//Irgendwas ist schiefgelaufen :-(
echo "<p>Nachricht konnte nicht gesendet werden!</p>";
}
} else {
//Es wurden keine Formulardaten übergeben ->
//Gib einen HTML-Block mit dem Formular aus.
?>
<p><font face="arial" color="darkblue" size=2>Bei Fragen zu unserer Website, für Lob, Kritik oder
Verbesserungsvorschläge können Sie das folgende Formular
für Ihre Nachricht benutzen:</p>
<form accept-charset="utf-8" method="post" action="">
<table>
<tbody>
<tr>
<td>
<label for="Absender"><font face="arial" color="darkblue" size=2><b>Absender:</b></label><br/>
(gültige E-Mail-Adresse notwendig)<br>
</td>
<td>
<input id="Absender" name="Absender"/>
</td>
</tr>
<tr>
<td>
<label for="Betreff"><font face="arial" color="darkblue" size=2><b>Betreff:</b></label><br/>
(mindestens drei Zeichen notwendig)
</td>
<td>
<input id="Betreff" name="Betreff"/>
</td>
</tr>
<tr>
<td>
<label for="Text"><font face="arial" color="darkblue" size=2><b>Text:</b></label><br/>
(mindestens zehn Zeichen notwendig)
</td>
<td>
<textarea id="Text" name="Text" rows="5" cols="40">
</textarea>
<input type="hidden" id="code" name="code" value="<?php echo($code); ?>"/>
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" name="los" value="Abschicken!"/><input type="reset" value="Eingaben löschen">
</td>
</tr>
</tbody>
</table>
</form>
<?php


Schon vorab vielen Dank.

Chris
Last edited: 2010-11-07 02:18:22 +0100 (CET)

View full thread [php] Problem mit Formularfelderüberprüfung und UTF-8