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, 9046 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...