Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12582[/thread]

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

Leser: 27


<< |< 1 2 3 4 5 6 7 8 ... 11 >| >> 104 Einträge, 11 Seiten
Gast wer
 2010-11-13 11:12
#142699 #142699
Nun müsste man wissen was in Zeile 220 von /WWWROOT/11111/htdocs/kontaktformular.php steht. Du hast nur 67 Zeilen gepostet.

Aber der Fehler kann auch schon vorher sein, und php stolpert erst in Zeile 220 darüber.
Last edited: 2010-11-13 11:22:54 +0100 (CET)
AndiE
 2010-11-13 11:48
#142700 #142700
User since
2010-10-24
65 Artikel
BenutzerIn
[default_avatar]
Hallo, ich habe den Text mal umformatiert, damit man die Klammernzuordnung sieht. Bei mir wird er so ohne Fehler angenommen.

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
<?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]))
{
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
{
//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>";
}
}// ende foreach
}// end if
else
{
//Es wurden keine Formulardaten übergeben ->
//Gib einen HTML-Block mit dem Formular aus.
}
?>
GwenDragon
 2010-11-13 13:09
#142701 #142701
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Das ist ja nur ein Ausschnitt. Wer weiß, was er da jetzt zusammen gebastelt hat und was selbst geändert.

Er sagte ja, es sei das Programm aus c't 22/05, S. 208 (Download des Zip).
die Drachin, Gwendolyn


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

Gast Chris
 2010-11-13 17:34
#142708 #142708
Hallo,

ich habe nun einmal den Quelltext-Vorschlag eingefügt und folgende Fehlermeldung erhalten:
Parse error: syntax error, unexpected '}' in /WWWROOT/11111/htdocs/kontaktformular.php on line 284

Anmerkung zu GwenDragon: Der Quelltext ist komplett und es wurde nichts geändert.
Ich kann mir gar nicht vorstellen, dass wir nun das Ding nicht zum Laufen bringen, da es ja wie gesagt ein öffentlicher Quelltext ist.

Noch eine Anmerkung von vorher. Die Seite läuft unter UTF-8 ggf. liegt hier ja eine Thematik, die noch im Quelltext berücksichtigt werden muß.

Nun haben wir alle soviel Zeit investiert und sollten gemeinsam zu einer Lösung kommen, oder?

Danke schon einmal.

Chris
Last edited: 2010-11-13 18:02:29 +0100 (CET)
topeg
 2010-11-13 19:28
#142714 #142714
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Also ich wundere mich über die Zeile in der die Fehlermeldung auftritt. Ich kann nirgendwo in dem was du gepostet hast eine Zeile 284 finden. Ich bin mir sicher, dass die Datei /WWWROOT/11111/htdocs/kontaktformular.php um einiges mehr enthält aus du hier zugibst.
Gast Chris
 2010-11-13 20:45
#142724 #142724
Hallo,

noch zur Klärung.

Das php Kontaktformular ist in html eingebettet und daher startet es nicht wie im geposteten Beitrag mit Zeile 1, sondern mit einer höheren Zeilennummer. Der html Part hat nichts mit dem funktionieren des Kontaktformulars zu tun.
In diesem Fall ist Zeile 284 der Abschluß des php Scripts.
Wie gesagt, das Kontaktformular funktionert, aber nur nicht mit Einträgen die Umlaute oder Sonderzeichen enthalten.
Das ist das einzige Problem, welches ich hier versuche zu lösen.

Chris

Last edited: 2010-11-13 20:47:49 +0100 (CET)
AndiE
 2010-11-14 12:12
#142737 #142737
User since
2010-10-24
65 Artikel
BenutzerIn
[default_avatar]
Hallo,

überprüfe bitte die Funktion der foreach-Schleife, die die Eingaben matcht. Fehlt da eine "}"?
Gast Chris
 2010-11-14 18:03
#142747 #142747
Hallo,

das weiß ich nicht, aber wie gesagt, das Script funktioniert ja einwandfrei bis auf die Umlaute und Sonderzeichen. Das ist das einzige Problem.
Der Script Anteil bei foreach sieht wie folgt aus:
Quote
//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)) {
$debug = bin2hex($wert);
die("DEBUG #$debug# ". '<br> Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);
} else {
//Der Rest wird weggeworfen.
unset($_POST[$parameter]);
}
}


Ich denke, dass Problem lässt sich irgendwie anders lösen, aber halt nur die Frage wie? Aber vielleicht ist ja auch das }, aber dann wo einbauen?

Chris
AndiE
 2010-11-14 21:00
#142748 #142748
User since
2010-10-24
65 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//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]);
}
}


Hallo noch eine } eingefügt. Geht es nun??
Gast Chris
 2010-11-15 21:15
#142764 #142764
Hallo,

anscheinend ist meine Antwort von gestern nicht hochgeladen worden, deshalb noch einmal.

Leider gab es erneut eine Syntax Fehlermeldung bzgl. dem zusätzlichen } Zeichen.

Der PHP Script lautet nun komplett wie folgt:

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
<?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.
}?>


Wie gesagt, das Problem bezieht sich nur auf die Formulardatenüberprüfung bei Umlauten und Sonderzeichen im UTF-8 Kontext.

Vielleicht hat ja jemand noch eine Idee, da das Script eigentlich relativ weit verbreitet sein sollte.

Gruß

Chris
Last edited: 2010-11-15 21:27:07 +0100 (CET)
<< |< 1 2 3 4 5 6 7 8 ... 11 >| >> 104 Einträge, 11 Seiten



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