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, 9059 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
gelöst Wie updatet man Php ab auf Windows ? (5)

Frage von rainergugus zum Thema PHP ...

Batch & Shell
gelöst Batch - PHP - W10 - w7 - w2k8r2 (4)

Frage von Xaero1982 zum Thema Batch & Shell ...

PHP
PHP: URL kürzen (14)

Frage von michi-ffm zum Thema PHP ...

PHP
gelöst PHP 7 und LDAP mit Umlauten (3)

Frage von wiesi200 zum Thema PHP ...

Neue Wissensbeiträge
Sicherheits-Tools

Sicherheitstest von Passwörtern für ganze DB-Tabellen

(1)

Tipp von gdconsult zum Thema Sicherheits-Tools ...

Peripheriegeräte

Was beachten bei der Wahl einer USV Anlage im Serverschrank

(9)

Tipp von zetboxit zum Thema Peripheriegeräte ...

Windows 10

Das Windows 10 Creators Update ist auf dem Weg

(6)

Anleitung von BassFishFox zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Exchange Server
Exchange 2016 Standard Server 2012 R2 Hetzner Mail (36)

Frage von Datsspeed zum Thema Exchange Server ...

Verschlüsselung & Zertifikate
Mit Veracrypt eine zweite interne (non-system) Festplatte verschlüsseln (10)

Frage von Bernulf zum Thema Verschlüsselung & Zertifikate ...

Internet Domänen
Nameserver ein Geist? (6)

Frage von zelamedia zum Thema Internet Domänen ...

Microsoft Office
Übertrag in eine andere Tabelle (6)

Frage von charmeur zum Thema Microsoft Office ...