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 3) [gelöst]

Leser: 27


<< |< 1 2 3 4 5 6 ... 11 >| >> 104 Einträge, 11 Seiten
Gast wer
 2010-11-05 21:32
#142504 #142504
Bei der Überprüfung der Eingaben werden Umlaute nicht beachtet. Ohne den Code zu sehen kann man nicht sagen wo das Problem genau liegt.
Gast Chris
 2010-11-06 00:45
#142507 #142507
Der Code ist am Anfang dieses Themas eingestellt worden. Es handelt sich dabei um ein php Kontaktformular mit einem Spam-Schutz.
Ich habe auf dieses Thema aufgesetzt, da ich genau das gleiche Problem habe.
Umstellung von ISO auf UTF, wie bereits geschildert und dann die Problematik bei der Eingabe von Sonderzeichen und Umlauten.
Hilft diese Erklärung?
Kann jetzt einer helfen?

Chris
Last edited: 2010-11-06 01:25:35 +0100 (CET)
renee
 2010-11-06 07:14
#142508 #142508
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie sieht denn Dein PHP-Skript aus?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
GwenDragon
 2010-11-06 09:26
#142509 #142509
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
Da wird im PHP nicht korrekt bei Nicht-ASCII-Zeichen geprüft.

Solange wir nicht wissen, was für ein PHP-Programm das ist (Link zum Ersteller) oder Quellcode, können wir nichts machen.
die Drachin, Gwendolyn


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

Gast Chris
 2010-11-06 13:10
#142510 #142510
Hallo,

erstellt wurde die PHP-Datei mit Notepad++.

Der Überprüfungspart des PHP Quellcodes, der die Probleme mit den Umlauten und Sonderzeichen generiert sieht im PHP wie folgt aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  <?php

//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]);
}
}
?>


Was heißt eigentlich Link zum Ersteller?

Könnt Ihr jetzt weiterhelfen?

Chris
PS: Wie gesagt, den kompletten Quellcode sieht man im ersten Beitrag zu diesem Thema
Last edited: 2010-11-06 13:27:07 +0100 (CET)
GwenDragon
 2010-11-06 13:30
#142511 #142511
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
Quote
Was heißt eigentlich Link zum Ersteller?

Link zum Sourcecode beim Ersteller des Programms.

Code: (dl )
1
2
if(!preg_match($pruefung[$parameter], $wert)) die('Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);
Und?
Wenn du mal angeben würdest was in $pruefung[$parameter] bzw. in dem Array pruefung bei den problematischen Eingaben drin ist?

//EDIT: Ach ist das der Code aus msg #115148?
Last edited: 2010-11-06 14:14:48 +0100 (CET)
die Drachin, Gwendolyn


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

GwenDragon
 2010-11-06 13:51
#142512 #142512
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
Also ich habe bei dem Testcode (UTF-kodierter PHP-Code) kein Problem:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php $pruefung = array(
'name' => '/^([A-Za-z])[a-z]+(([ -])([A-Za-z])[a-z]+)*$/',
'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,}$/'
);
$parameter = 'betreff';
$wert = "ÄÖÜäöüß";
if(!preg_match($pruefung[$parameter], $wert)) die('Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);?>

Bei mir kommt da kein die.

Kann es sein, dass im Feld betreff mehr drin ist?
Kannst du nicht mal das Ganze ausgeben?

Code: (dl )
1
2
3
4
if(!preg_match($pruefung[$parameter], $wert)) {
$debug = bin2hex($wert);
die("DEBUG #$debug# ". '<br> Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);?
}


Last edited: 2010-11-06 14:03:19 +0100 (CET)
die Drachin, Gwendolyn


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

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)
Gast Chris
 2010-11-10 23:36
#142625 #142625
Hallo,

gibt es keinen Hinweis mehr?
Ich habe ja nun den gesamten Script dargestellt. Kann man wenigstens die Umlautüberpfrüfung deaktivieren, so dass zumindest die Überprüfung erfolgreich durchläuft?

Danke für die Rückinfos.

Chris
Last edited: 2010-11-10 23:39:39 +0100 (CET)
GwenDragon
 2010-11-11 17:20
#142645 #142645
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
Ersetze
Code: (dl )
1
2
if(!preg_match($pruefung[$parameter], $wert)) die('Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);
}

durch
Code: (dl )
1
2
3
4
if(!preg_match($pruefung[$parameter], $wert)) {
$debug = bin2hex($wert);
die("DEBUG #$debug# ". '<br> Eingaben unzureichend - bitte gehen Sie zurück zum Feld ' . $parameter . ': ' . $wert);
}

und zeig uns mal was dann als Ausgabe bei einem Problem kommt!

//EDIT: seltsames Fragezeichen in Code entfernt
Last edited: 2010-11-12 09:19:26 +0100 (CET)
die Drachin, Gwendolyn


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

<< |< 1 2 3 4 5 6 ... 11 >| >> 104 Einträge, 11 Seiten



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