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

Printed on: April 26, 2024 at 10:04 o'clock

Member: Dani
Dani Aug 03, 2008 at 13:22:04 (UTC)
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
Member: masterG
masterG Aug 05, 2008 at 18:58:35 (UTC)
Goto Top
Auch ein Lob von mir!
Wie auch schon Dani gesagt hat du hast es ganz gut gelöst!

mfg
masterG
Member: bytecounter
bytecounter Aug 06, 2008 at 07:14:10 (UTC)
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