Universelle Datenvalidierung mit PHP
19.07.2008
16:15:32 Uhr6032 Aufrufe
3 Antworten
16:15:32 Uhr
3 Antworten
Noch nicht bewertet
Eingehende Daten auf (absichtliche) Manipulation / Fehler prüfen.
Hallo zusammen,
Inzwischen werden Fehler bei Formulareingaben meist sofort per JS abgefangen und der Benutzer z. B. über ein popup auf die fehlerhafte Eingabe hingewiesen. Dies ist zwar benutzerfreundlich, aber dient nicht der Serversicherheit.
GET und POST-Anweisungen können recht einfach "manuell" erstellt werden, so dass Eingaben auf jeden Fall serverseitig nochmals auf Gültigkeit überprüft werden sollen.
Hierfür gibt es einige Möglichkeiten, ich möchte hier - insbesondere für Anfänger - mal eine universell einsetzbare Lösung vorstellen. Eine Anpassung für die eigenen Programme sollte problemlos möglich sein. Ich habe deshalb bewusst auf OOP verzichtet.
Hier erstmal die Funktion:
und hier unser Beispielprogramm:
Inzwischen werden Fehler bei Formulareingaben meist sofort per JS abgefangen und der Benutzer z. B. über ein popup auf die fehlerhafte Eingabe hingewiesen. Dies ist zwar benutzerfreundlich, aber dient nicht der Serversicherheit.
GET und POST-Anweisungen können recht einfach "manuell" erstellt werden, so dass Eingaben auf jeden Fall serverseitig nochmals auf Gültigkeit überprüft werden sollen.
Hierfür gibt es einige Möglichkeiten, ich möchte hier - insbesondere für Anfänger - mal eine universell einsetzbare Lösung vorstellen. Eine Anpassung für die eigenen Programme sollte problemlos möglich sein. Ich habe deshalb bewusst auf OOP verzichtet.
Hier erstmal die Funktion:
01.
<?php 02.
// proof.php 03.
04.
// Prüfe emfpangene Daten 05.
// &$arr: Eine Referenz auf das zu prüfende Array - wir arbeiten hier mit den Originaldaten!! 06.
// $cat: Wie soll geprüft werden 07.
function check_input (&$arr, $cat) { 08.
// Fehler: Bei den zu prüfenden Daten handelt es sich nicht um ein Array 09.
if (!is_array ($arr) ) die ("Array required in check_input()!"); 10.
11.
// Definition der zugelassenen Werte 12.
switch ($cat) { 13.
14.
case 'mailform': 15.
// beim Kontaktformular 16.
$proof = array ( 17.
'from' => '/^ [\w.!#%&\*\/=\?\^\`\{\|\}\~+-]{1,64} \@ [[:alnum:].-]{1,255} \. [a-z]{2,6} $/xi', 18.
'subject' => '/^[[:print:]]{3,}$/', 19.
'name' => '/^[[:print:]]{3,}$/', 20.
'phone' => '/^[0-9]$/', 21.
'message' => '/^[[:print:][:space:]]{10,}$/', 22.
); 23.
break; 24.
25.
case 'newsletter': 26.
// beim Newsletter 27.
$proof = array ( 28.
'mail' => '/^ [\w.!#%&\*\/=\?\^\`\{\|\}\~+-]{1,64} \@ [[:alnum:].-]{1,255} \. [a-z]{2,6} $/xi', 29.
'name' => '/^[[:print:]]{3,}$/', 30.
); 31.
break; 32.
33.
// hier könnten noch weitere Formulare eingefügt werden 34.
// .... 35.
36.
default: 37.
// default gibt es natürlich nicht!! 38.
39.
} # switch ($cat) 40.
41.
// Nun gehen wir jeden einzelnen Wert des empfangenen Arrays durch 42.
foreach ($arr as $key => $value) { 43.
44.
if ( ! empty ($proof[$key] ) ) { 45.
// Wert im Prüfarray muss gesetzt sein 46.
if (!preg_match ($proof[$key], $value ) ) { 47.
// Wert entspricht nicht dem Suchmuster. Beende die Funktion und gib den betroffenen Schlüsselnamen zurück 48.
return $key; 49.
} # if (!preg_match ($proof[$key], $value ) ) 50.
51.
} # if ( ! empty ($proof[$key] ) ) 52.
53.
elseif ( is_array ($value) ) { 54.
// <option>-Felder werden nicht geprüft (hier könnte ggf. check_input () rekursiv aufgerufen werden) 55.
} #elseif ( is_array ($value) ) 56.
57.
else { 58.
// lösche ungültige Schlüssel-Wert-Paare! 59.
// deshalb die Originaldaten, was gelöscht ist, kann keinen Schaden anrichten! 60.
unset ($arr[$key]); 61.
} # else 62.
63.
} # foreach ($arr as $key => $value) 64.
65.
// kein Fehler gefunden, gib 'false' zurück 66.
return false; 67.
} 68.
69.
70.
?>und hier unser Beispielprogramm:
01.
<?php 02.
// Beispielprogramm 03.
// beispiel.php 04.
// Hier: Formular für den Newsletter 05.
06.
setlocale(LC_ALL, 'de_DE'); // Damit deutsche Sonderzeichen (z. B. Umlaute) korrekt erkannt werden!! 07.
08.
require_once ('proof.php'); 09.
10.
?> 11.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 12.
<html xmlns="http://www.w3.org/1999/xhtml"> 13.
<head> 14.
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 15.
<title>Unbenanntes Dokument</title> 16.
</head> 17.
<body> 18.
<?php 19.
20.
if ($_POST or $_GET) { 21.
if (! check_input ($_GET, 'newsletter')) { 22.
// Daten ok 23.
echo "<p>Daten ok</p>"; 24.
} # if (! check_input ($_GET, 'newsletter');) 25.
26.
else { 27.
// Daten fehlerhaft!! 28.
echo "<p>Daten fehlerhaft</p>"; 29.
} # else 30.
31.
} # if ($_POST or $_GET) 32.
33.
?> 34.
35.
<form action="beispiel.php" method="get"> 36.
<input type="text" name="mail" value="<?php echo $_GET['mail']; ?>" /> 37.
<br /> 38.
<input type="text" name="name" value="<?php echo $_GET['name']; ?>" /> 39.
<br /> 40.
<input type="submit" name="submit" /> 41.
</form> 42.
43.
</body> 44.
</html> 45.
46.
bytecounter schreibt am 06.08.2008 um 09:14:10 Uhr
Hallo,
mit soviel Lob hab ich gar nicht gerechnet
Aber danke für die Blumen!
Nun bleibt zu hoffen, dass das auch fleissig eingesetzt wird. Denke, dass das gerade für Anfänger eine gute Hilfestellung ist, die selbst programmierte Seite sicherer zu gestalten.
vg
Bytecounter
mit soviel Lob hab ich gar nicht gerechnet
Aber danke für die Blumen!
Nun bleibt zu hoffen, dass das auch fleissig eingesetzt wird. Denke, dass das gerade für Anfänger eine gute Hilfestellung ist, die selbst programmierte Seite sicherer zu gestalten.
vg
Bytecounter















