Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: bytecounter

bytecounter (Level 2) - Jetzt verbinden

19.07.2008, aktualisiert 06.08.2008, 9115 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
PHP

PHP RFC: Mcrypt Extension wird ab PHP 7.2 entfernt

Information von FrankPHP

Ein RFC ist grob eine Abstimmung unter den PHP-Entwicklern, um neue, bestehende oder alte Feature hinzuzufügen, zu ändern, oder ...

PHP

PHP 7.2 veröffentlicht

Information von FrankPHP

Das PHP-Team hat heute, den 30.11.207 die aktuelle Version von PHP 7.2 veröffentlicht. Eine der wichtigsten Änderungen für PHP-Entwickler ...

Administrator.de Feedback

Entwicklertagebuch: PHP 7

Information von admtechAdministrator.de Feedback4 Kommentare

Hallo Administrator User, mit dem heutigen Tag haben wir unsere Server komplett auf die PHP Version 7 umgestellt. Wir ...

PHP

Endlich: PHP bekommt eine offizielle Spezifikation

Information von FrankPHP

Dank Facebook bekommt die Programmiersprache PHP nach über 20 Jahren endlich eine offizielle Spezifikation. Facebook und die PHP-Community arbeiten ...

Neue Wissensbeiträge
Internet

Europa baut Zensurinfrastruktur auf: EU-Parlament stimmt für Upload-Filter, Leistungsschutzrecht und gegen KI-Forschung

Information von Frank vor 2 TagenInternet9 Kommentare

Eine sehr schlechte Entscheidungen für die Zukunft Europas ist gefallen: Der Rechtsausschuss im EU-Parlament stimmte heute morgen in einer ...

Windows 10

Mikrofon von Headset geht nach Update auf Windows 10 1803 nicht mehr

Tipp von Deepsys vor 4 TagenWindows 102 Kommentare

Ich verwende ein Plantronics Headset das per USB mit dem Windows 10 PC verbunden ist. Damit kann ich auch ...

Video & Streaming

Ruckelfreies Fernsehen auf Smartphone oder Tablet - in SD oder gar HD - Eine Alternative zum Fritz DVB-C Receiver

Anleitung von power-user vor 4 TagenVideo & Streaming9 Kommentare

Wer kennt das nicht: Man möchte gemütlich auf dem Balkon sitzen und vielleicht grillen und dabei das WM-Spiel gucken ...

Erkennung und -Abwehr
Trendmicro WFBS 10 ist in deutsch verfügbar!
Tipp von VGem-e vor 5 TagenErkennung und -Abwehr4 Kommentare

Servus Kollegen, downloadbar unter

Heiß diskutierte Inhalte
LAN, WAN, Wireless
WLAN-Übersicht wie FritzWLAN jedoch für PC gesucht
gelöst Frage von HenereLAN, WAN, Wireless16 Kommentare

Servus, ich suche für einen Windows PC eine Anwendung die so ähnlich wie die FritzWLAN App auf dem Smartphone ...

Netzwerke
Netzwerkkommunikation von Windows 10 aus Freigabe mit Windows XP funktioniert nicht
gelöst Frage von KLinnebankNetzwerke14 Kommentare

Hallo werte Gemeinde, ja, es ist Freitag. Aber das ist KEINE Freitagsfrage Ich habe ein für mich völlig wirres ...

Festplatten, SSD, Raid
Server Architektur mit RAID 5 - wozu interne Platten?
Frage von Pierre78Festplatten, SSD, Raid10 Kommentare

Hallo, ich beschäftige mich gerade mit RAID Systemen. Ich habe mir einen gebrauchten Dell PowerEdge R515 gekauft. Dieser hat ...

Samba
Netzlaufwerk über VPN hat Probleme
Frage von geocastSamba8 Kommentare

Hallo Zusammen Ich habe hier ein QNAP TS-269 Pro (aktuellste Firmware) NAS in einem entfernten Standort, der über VPN ...