Schrift
[thread]12582[/thread]

[php] Problem mit Formularfelderüberprüfung und UTF-8 (Seite 6) [gelöst]

Leser: 27


<< |< 1 ... 3 4 5 6 7 8 9 ... 11 >| >> 104 Einträge, 11 Seiten
Gast wer
 2010-11-16 00:21
#142768 #142768
Ohne Kommentare konnte man sehen, dass einige geschlossene Klammern falsch gesetzt waren:

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
<?php
error_reporting(E_ALL);
setlocale(LC_ALL, 'de_DE.UTF-8');
$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)));
if(isset($_POST['los']))
{
if(!isset($_POST['code']) || $_POST['code'] != $code) die('Mailcode fehlt!');
$pruefung = array(
'Absender' => '/^ [\w.!#%&\*\/=\?\^\`\{\|\}\~+-]{1,64} \@ [[:alnum:].-]{1,255} \. [a-z]{2,6} $/xi',
//'Absender' => '/^[\w.+-]{2,64}\@[\w.-]{2,255}\.[a-z]{2,6}$/',
'Betreff' => '/^[[:print:]]{3,}$/',
//'Betreff' => '/^[[:alnum:]\s\?.!,;:\(\)\/\"-]{3,}$/',
'Text' => '/^[[:print:][:space:]]{10,}$/'
);

foreach($_POST as $parameter => $wert)
{
if(isset($pruefung[$parameter]))
{
if(!preg_match($pruefung[$parameter], $wert))
{
$debug = bin2hex($wert);
die("DEBUG #$debug# ". '<br> Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);
}
}
else
{
if(!getmxrr(substr(strstr($_POST['Absender'], '@'), 1), $mxhosts)) die("Konnte keine gültige Domain für " . $_POST['Absender'] . " finden!");
if(mail('email@website.de', $_POST['Betreff'], $_POST['Text'], "From:" . $_POST['Absender']))
{
echo "<p>Nachricht von " . $_POST['Absender'] . " an website.de gesendet!</p>";
}
else
{
echo "<p>Nachricht konnte nicht gesendet werden!</p>";
}
}
}
}
else
{
}
?>

Last edited: 2010-11-16 01:11:52 +0100 (CET)
GwenDragon
 2010-11-16 10:37
#142771 #142771
User since
2005-01-17
14536 Artikel
Admin1
[Homepage]
user image
Ich bekomme mit folgendem Code unter PHP 4.4 und 5.3 keine Meldung bezüglich einer Klammer und auf meinem Apache 2.2 läuft es.
Du solltest in deinem Editor im Code mal schauen wie die Klammern verschachtelt sind, da gibt es bestimmt einen Befehl für von Klammer zu Klammer zu springen.
Sionnvoll ist es auch, die Inhalte von {}-Blöcken einzurücken.
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
<?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.UTF-8');
//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]))
// wenn ein Muster vorhanden
{
if(!preg_match($pruefung[$parameter], $wert))
{
$debug = bin2hex($wert);
die("DEBUG #$debug# ". '<br> Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);
}
// Das Muster ist gematcht
}
else
{
//wenn kein Muster vorhanden
//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@website.de', $_POST['Betreff'], $_POST['Text'], "From:" . $_POST['Absender'])) {
//Es hat geklappt: Bestätigung ausgeben
echo "<p>Nachricht von " . $_POST['Absender'] . " an website.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.
?>
<html>
<body>
<form action="#" method="POST" accept-charset="UTF-8">
<input type="hidden" name="code" value="<?=$code ?>">
<input type="hidden" name="los" value="1">
Absender: <input type="text" name="Absender"><br>
Betreff: <input type="text" name="Betreff"><br>
Eingabe: <input type="text" name="Text"><br>
<input type="submit" value="Senden">
</form>
</body>
</html>
<?php } ?>

Last edited: 2010-11-16 10:51:08 +0100 (CET)
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Gast Chris
 2010-11-18 21:23
#142861 #142861
Hallo,

nun funktioniert zumindest das Formular und es wird kein Syntax-Fehler mehr ausgegeben. Dafür erscheint aber folgende Fehlermeldung, wenn man Umlaute eingibt:

DEBUG #44696573206973742065696e206772c3b6c39f657265722054657374#
Eingaben unzureichend - bitte gehen Sie zurück zum Feld Betreff: Dies ist ein größerer Test

Außerdem ist die Formatierung des Kontaktformulars nicht mehr vorhanden.

... und nun?

Gruß

Chris
Last edited: 2010-11-18 21:40:22 +0100 (CET)
Gast wer
 2010-11-18 22:25
#142862 #142862
Die Eingabe ist UTF8 kodiert:
Code: (dl )
1
2
c3b6 => ö
c39f => ß

Eine Minute suche erbrachte:
Quote
A special option is the /u which turns on the Unicode matching mode, instead of the default 8-bit matching mode. You should specify /u for regular expressions that use \x{FFFF}, \X or \p{L} to match Unicode characters, graphemes, properties or scripts. PHP will interpret '/regex/u' as a UTF-8 string rather than as an ASCII string.

Last edited: 2010-11-18 22:50:19 +0100 (CET)
Gast Chris
 2010-11-18 23:45
#142864 #142864
...und was heißt das nun bzw. wie muß ich das Script ändern, so dass es mit den Umlauten klappt?

Gruß

Chris
Last edited: 2010-11-18 23:53:14 +0100 (CET)
Linuxer
 2010-11-19 00:06
#142865 #142865
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Deine Regex zur Prüfung "laufen" nicht mit Unicode-Unterstützung.
Die kann eingeschaltet werden, wenn man ein /u hinten an die Regex hängt. Also wird aus /regex/ ein /regex/u.
Das einfach mal beim Regex für den Betreff eintragen und das ganze nochmal ausprobieren...

edit: 1. regex fixed
Last edited: 2010-11-19 10:49:12 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast Chris
 2010-11-19 19:28
#142889 #142889
...ach so; und wo muß ich dies genau im php Script eintragen?
Wie sieht das dann im Quelltext von oben aus, da ich dies noch nie gemacht habe?
Danke für den Support.
Gruß
Chris
Last edited: 2010-11-19 19:39:13 +0100 (CET)
GwenDragon
 2010-11-19 19:42
#142890 #142890
User since
2005-01-17
14536 Artikel
Admin1
[Homepage]
user image
Ersetze
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$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,}$/'
);

durch
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$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,}$/u',
//restriktivere Variante:
//'Betreff' => '/^[[:alnum:]\s\?.!,;:\(\)\/\"-]{3,}$/u',
'Text' => '/^[[:print:][:space:]]{10,}$/u'
);
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Gast Chris
 2010-11-19 21:20
#142896 #142896
...erneut folgende Fehlermeldung:

DEBUG #44696573206973742065696e206772c3b6c39f657265722054657374#
Eingaben unzureichend - bitte gehen Sie zurück zum Feld Betreff: Dies ist ein größerer Test

Außerdem ist die Formatierung/Layout wie ich es vom alten Kontaktformular her kenne komplett verändert?

Gruß

Chris
Last edited: 2010-11-19 21:38:23 +0100 (CET)
Gast Chris
 2010-11-20 10:17
#142899 #142899
Hallo,

so dass mit dem Layout passt nun wieder nur mit der Außnahme, dass im Feld "Text" beim Eintrag eine andere Zeichenformatierung als in den Feldern Absender bzw. Betreff erscheint -> Vielleicht gibt es hierzu auch einen Tipp?

Darüber hinaus habe ich nun einmal den kompletten (!) Script mit allen genannten Modifikationen beigefügt. Ggf. kann man ja nun in diesem Kontext noch einmal prüfen, warum Sonderzeichen und Umlaute zu einem Debug-Fehler führen:

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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?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.UTF-8');
//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,}$/u',
//restriktivere Variante:
//'Betreff' => '/^[[:alnum:]\s\?.!,;:\(\)\/\"-]{3,}$/u',
'Text' => '/^[[:print:][:space:]]{10,}$/u'
);

//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]))
// wenn ein Muster vorhanden
{
if(!preg_match($pruefung[$parameter], $wert))
{
$debug = bin2hex($wert);
die("DEBUG #$debug# ". '<br> Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);
}
// Das Muster ist gematcht
}
else
{
//wenn kein Muster vorhanden
//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@website.de', $_POST['Betreff'], $_POST['Text'], "From:" . $_POST['Absender'])) {
//Es hat geklappt: Bestätigung ausgeben
echo "<p>Nachricht von " . $_POST['Absender'] . " an website.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>Ihre Nachricht:</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
//Schließt die if-else-Schleife
}
?>


Schon vorab vielen Dank für die Unterstützung.

Gruß

Chris
Last edited: 2010-11-20 10:43:19 +0100 (CET)
<< |< 1 ... 3 4 5 6 7 8 9 ... 11 >| >> 104 Einträge, 11 Seiten



View all threads created 2008-10-04 14:02.