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:
und hier unser Beispielprogramm:
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>
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 92406
Url: https://administrator.de/contentid/92406
Ausgedruckt am: 19.11.2024 um 05:11 Uhr
3 Kommentare
Neuester Kommentar