393
customer007
d4shoerncheN
imebro
manuwj
nikoatit
Reini82
Skyemugen
zanko

Universelle Datenvalidierung mit PHP

Mitglied: bytecounter
19.07.2008
16:15:32 Uhr
6032 Aufrufe
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:

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.
 

Mitglied: Dani
Dani schreibt am 03.08.2008 um 15:22:04 Uhr
Hi,
endlich.... face-wink Ich wollte meine Klasse auch schon reinstellen, aber mir fehlt dazu einfach die Zeit.
Sehr schön gelöst...perfekt!


Gruss,
Dani
Mitglied: masterG
masterG schreibt am 05.08.2008 um 20:58:35 Uhr
Auch ein Lob von mir!
Wie auch schon Dani gesagt hat du hast es ganz gut gelöst!

mfg
masterG
Mitglied: bytecounter
bytecounter schreibt am 06.08.2008 um 09:14:10 Uhr
Hallo,
mit soviel Lob hab ich gar nicht gerechnet face-smile
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
mehr ...Ähnliche Beiträge