Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Universelle Datenvalidierung mit PHP

Anleitung Entwicklung PHP

Mitglied: bytecounter

bytecounter (Level 2) - Jetzt verbinden

19.07.2008, aktualisiert 06.08.2008, 9067 Aufrufe, 3 Kommentare

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
03.08.2008 um 15:22 Uhr
Hi,
endlich.... Ich wollte meine Klasse auch schon reinstellen, aber mir fehlt dazu einfach die Zeit.
Sehr schön gelöst...perfekt!


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

mfg
masterG
Bitte warten ..
Mitglied: bytecounter
06.08.2008 um 09:14 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
Bitte warten ..
Ähnliche Inhalte
C und C++
C-sharp ZIP-Ordner an PHP senden (9)

Frage von Yanmai zum Thema C und C ...

Linux
gelöst Php redis an Socket binden? (2)

Frage von FA-jka zum Thema Linux ...

Debian
gelöst Plesk php-fpm Fehler (7)

Frage von sebastian2608 zum Thema Debian ...

Neue Wissensbeiträge
Windows 10

Windows 8.x oder 10 Lizenz-Key aus dem ROM auslesen mit Linux

(6)

Tipp von Lochkartenstanzer zum Thema Windows 10 ...

Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(40)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Heiß diskutierte Inhalte
Windows 10
gelöst Windows 10 Home "Netzlaufwerk nicht bereit" (19)

Frage von Oggy01 zum Thema Windows 10 ...

DNS
gelöst Komplette TLD Überschreiben bzw eigene Definieren (10)

Frage von Herbrich19 zum Thema DNS ...

Exchange Server
gelöst RU 17 Exchange 2010 . Erfahrungen? (10)

Frage von keine-ahnung zum Thema Exchange Server ...

Datenbanken
gelöst MySQL Zeiterfassungs-Problematik (wer ist eingecheckt) (9)

Frage von NativeMode zum Thema Datenbanken ...