bytecounter
Goto Top

Universelle Datenvalidierung mit PHP

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:

<?php
// proof.php

// Prüfe emfpangene Daten
// &$arr: Eine Referenz auf das zu prüfende Array - wir arbeiten hier mit den Originaldaten!!
// $cat: Wie soll geprüft werden
function check_input (&$arr, $cat) {
	// Fehler: Bei den zu prüfenden Daten handelt es sich nicht um ein Array
	if (!is_array ($arr) ) die ("Array required in check_input()!");  

	// Definition der zugelassenen Werte
	switch ($cat) {
		
		case 'mailform':  
			// beim Kontaktformular
			$proof = array (
					'from' => '/^ [\w.!#%&\*\/=\?\^\`\{\|\}\~+-]{1,64} \@ [[:alnum:].-]{1,255} \. [a-z]{2,6} $/xi',  
					'subject' => '/^[[:print:]]{3,}$/',  
					'name' => '/^[[:print:]]{3,}$/',  
                                        'phone' => '/^[0-9]$/',  
					'message' => '/^[[:print:][:space:]]{10,}$/',  
			);
		break;
		
		case 'newsletter':  
			// beim Newsletter
			$proof = array (
					'mail' => '/^ [\w.!#%&\*\/=\?\^\`\{\|\}\~+-]{1,64} \@ [[:alnum:].-]{1,255} \. [a-z]{2,6} $/xi',  
					'name' => '/^[[:print:]]{3,}$/',  
			);
		break;

		// hier könnten noch weitere Formulare eingefügt werden
		// ....
		
		default:
			// default gibt es natürlich nicht!!
		
	} # switch ($cat)
	
	// Nun gehen wir jeden einzelnen Wert des empfangenen Arrays durch
	foreach ($arr as $key => $value) {
	
		if ( ! empty ($proof[$key] ) ) {
			// Wert im Prüfarray muss gesetzt sein
			if (!preg_match ($proof[$key], $value ) ) {
				// Wert entspricht nicht dem Suchmuster. Beende die Funktion und gib den betroffenen Schlüsselnamen zurück
				return $key;
			} # if (!preg_match ($proof[$key], $value ) )
			
		} # if ( ! empty ($proof[$key] ) )
		
		elseif ( is_array ($value) ) {
			// <option>-Felder werden nicht geprüft (hier könnte ggf. check_input () rekursiv aufgerufen werden)
		} #elseif ( is_array ($value) )
		
		else {
		       // lösche ungültige Schlüssel-Wert-Paare!
                       // deshalb die Originaldaten, was gelöscht ist, kann keinen Schaden anrichten!
			unset ($arr[$key]);
		} # else
		
	} # foreach ($arr as $key => $value)
	
	// kein Fehler gefunden, gib 'false' zurück 
	return false;
}


?>



und hier unser Beispielprogramm:

<?php
// Beispielprogramm
// beispiel.php
// Hier: Formular für den Newsletter

setlocale(LC_ALL, 'de_DE');	// Damit deutsche Sonderzeichen (z. B. Umlaute) korrekt erkannt werden!!  

require_once ('proof.php');  

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  
<title>Unbenanntes Dokument</title>
</head>
<body>
<?php

if ($_POST or $_GET) {
	if (! check_input ($_GET, 'newsletter')) {  
		// Daten ok
		echo "<p>Daten ok</p>";  
	} # if (! check_input ($_GET, 'newsletter');) 
	
	else {
		// Daten fehlerhaft!!
		echo "<p>Daten fehlerhaft</p>";  
	} # else
	
} # if ($_POST or $_GET)

?>

<form action="beispiel.php" method="get">  
	<input type="text" name="mail" value="<?php echo $_GET['mail']; ?>" />  
	<br />
	<input type="text" name="name" value="<?php echo $_GET['name']; ?>" />  
	<br />
	<input type="submit" name="submit" />  
</form>

</body>
</html>

Content-Key: 92406

Url: https://administrator.de/contentid/92406

Ausgedruckt am: 19.03.2024 um 09:03 Uhr

Mitglied: Dani
Dani 03.08.2008 um 15:22:04 Uhr
Goto Top
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 05.08.2008 um 20:58:35 Uhr
Goto Top
Auch ein Lob von mir!
Wie auch schon Dani gesagt hat du hast es ganz gut gelöst!

mfg
masterG
Mitglied: bytecounter
bytecounter 06.08.2008 um 09:14:10 Uhr
Goto Top
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