Zu Beginn des Leitfadens haben wir gesagt, dass die Datenfilterung der Grundstein für die Sicherheit von WEB-Anwendungen in jeder Sprache und auf jeder Plattform ist. Dazu gehört die Überprüfung der Dateneingabe in und von der Anwendung. Ein gutes Softwaredesign kann Entwicklern dabei helfen:
sicherzustellen, dass die Datenfilterung nicht umgangen werden kann,
sicherzustellen, dass illegale Informationen keine Auswirkungen auf rechtliche Informationen haben und
die Quelle der Daten identifizieren.
Es gibt verschiedene Ansichten darüber, wie sichergestellt werden kann, dass die Datenfilterung nicht umgangen werden kann. Zwei davon sind allgemeiner als andere und bieten ein höheres Maß an Sicherheit.
Planungsmethode Diese Methode wird mit einem einzigen PHP-Skript (über URL) geplant. Alle anderen Vorgänge werden bei Bedarf mithilfe von include oder require eingebunden. Dieser Ansatz erfordert im Allgemeinen, dass jeder URL eine separate GET-Variable für den Versand übergeben wird. Diese GET-Variable kann man sich als vereinfachtes Design vorstellen, das den Skriptnamen ersetzt. Beispiel:
http://example.org/dispatch.php?task=print_formdispatch.php ist die einzige Stammdatei (Dokumentstamm). Es ermöglicht Entwicklern, zwei sehr wichtige Dinge zu tun:
zu Beginn eine globale Sicherheitsverarbeitung in „dispatch.php“ zu implementieren und sicherzustellen, dass diese Verarbeitung nicht umgangen werden kann.
Es lässt sich leicht bestimmen, wo eine Datenfilterung erforderlich ist, insbesondere für einige spezielle Kontrollflussoperationen.
Weitere Informationen zum Skript „dispatch.php“ finden Sie im folgenden Beispiel:
<?php/* Global Security Handling*/switch ($_GET['task']){case 'print_form':include '/inc/presentation/form.inc '; break;case 'process_form':$form_valid = false;include '/inc/logic/process.inc';if ($form_valid){include '/inc/presentation/end.inc';}else{include '/ inc/ Presentation/form.inc';}break;default:include '/inc/presentation/index.inc';break;}?>Wenn dies das einzige öffentlich zugängliche PHP-Skript ist, können Sie sicher sein, dass dieses Programm das Design hat stellt sicher, dass die anfängliche globale Sicherheitsverarbeitung nicht umgangen werden kann. Außerdem können Entwickler so den Kontrollfluss bestimmter Aufgaben leichter erkennen. Dies ist zum Beispiel leicht zu erkennen, ohne den gesamten Code zu durchsuchen: Wenn $form_valid wahr ist, wird end.inc als einziges dem Benutzer angezeigt, da es vor der Einbindung von Process.inc liegt und gerade auf false initialisiert wurde kann festgestellt werden, dass die interne Logik von Process.inc es auf „true“ setzt; andernfalls wird das Formular erneut angezeigt (möglicherweise mit einer zugehörigen Fehlermeldung).
Beachten Sie, dass Sie, wenn Sie eine Verzeichnisanweisungsdatei wie index.php (anstelle von „dispatch.php“) verwenden, die URL-Adresse wie folgt verwenden können: http://example.org/?task=print_form .
Sie können auch die ApacheForceType-Umleitung oder mod_rewrite verwenden, um die URL-Adresse anzupassen: http://example.org/app/print-form .
Eine andere Möglichkeit, Methoden einzubinden, besteht darin, ein einzelnes Modul zu verwenden, das für die gesamte Sicherheitsbehandlung verantwortlich ist. Dieses Modul ist ganz vorne (oder ganz vorne) in allen öffentlichen PHP-Skripten enthalten. Weitere Informationen finden Sie im folgenden Skript security.inc
<?phpswitch ($_POST['form']){case 'login':$allowed = array();$allowed[] = 'form';$allowed[] = 'username' ; $allowed[] = 'password';$sent = array_keys($_POST);if ($allowed == $sent){include '/inc/logic/process.inc';}break;}?>In diesem Fall Es wird davon ausgegangen, dass jedes übermittelte Formular den eindeutigen Verifizierungswert des Formulars enthält, und security.inc verarbeitet die Daten im Formular, die gefiltert werden müssen, unabhängig. Das HTML-Formular, das diese Anforderung implementiert, lautet wie folgt:
<form action="/receive.php" method="POST"><input type="hidden" name="form" value="login" /><p>Benutzername : <input type="text" name="username" /></p><p>Passwort:<input type="password" name="password" /></p><input type="submit" / > </form>Ein Array namens $allowed wird verwendet, um zu prüfen, welche Formularvariablen zulässig sind. Diese Liste sollte konsistent sein, bevor das Formular verarbeitet wird. Die Prozesssteuerung entscheidet, was ausgeführt werden soll, und in „process.inc“ kommen die eigentlichen gefilterten Daten an.
Beachten Sie, dass Sie besser sicherstellen können, dass security.inc immer am Anfang jedes Skripts enthalten ist, indem Sie die Einstellung auto_prepend_file verwenden.
Filterbeispiel: Das Erstellen einer Whitelist ist für die Datenfilterung sehr wichtig. Da es unmöglich ist, für alle Formulardaten, auf die Sie stoßen, Beispiele zu nennen, können einige Beispiele Ihnen helfen, ein allgemeines Verständnis zu erlangen.
Der folgende Code validiert die E-Mail-Adresse:
<?php$clean = array();$email_pattern = '/^[^@s<&>]+@([-a-z0-9]+.) +[ az]{2,}$/i';if (preg_match($email_pattern, $_POST['email'])){$clean['email'] = $_POST['email'];}?> unten Der Code stellt sicher, dass der Inhalt von $_POST['color'] rot, grün oder blau ist:
<?php$clean = array();switch ($_POST['color']){case 'red':case 'green ' :case 'blue':$clean['color'] = $_POST['color'];break;}?>Der folgende Code stellt sicher, dass $_POST['num'] eine Ganzzahl ist:
<?php$ clean = array ();if ($_POST['num'] == strval(intval($_POST['num']))){$clean['num'] = $_POST['num'];} >Das Folgende Code stellt sicher, dass $_POST['num'] ein Float ist:
<?php$clean = array();if ($_POST['num'] == strval(floatval($_POST['num ']))){ $clean['num'] = $_POST['num'];}?> Jedes Beispiel verwendet das Array $clean vor der Namenskonvertierung. Dies ist eine bewährte Vorgehensweise für Entwickler, um festzustellen, ob ihre Daten möglicherweise gefährdet sind. Speichern Sie Daten niemals in $_POST oder $_GET, nachdem Sie sie validiert haben. Als Entwickler sollten Sie gegenüber Daten, die in superglobalen Arrays gespeichert sind, immer völlig misstrauisch sein.
Es sollte hinzugefügt werden, dass die Verwendung von $clean dabei helfen kann, darüber nachzudenken, was nicht gefiltert wurde, was eher der Rolle einer Whitelist ähnelt. Kann das Sicherheitsniveau verbessern.
Wenn Sie nur validierte Daten in $clean speichern, besteht das einzige Risiko bei der Datenvalidierung darin, dass das Array-Element, auf das Sie verweisen, nicht vorhanden ist und keine ungefilterten gefährlichen Daten vorhanden sind.
Timing Sobald die Ausführung des PHP-Skripts beginnt, bedeutet dies, dass alle HTTP-Anfragen beendet sind. Zu diesem Zeitpunkt hat der Benutzer keine Möglichkeit, Daten an das Skript zu senden. Daher können keine Daten in das Skript eingegeben werden (auch wenn register_globals aktiviert ist). Aus diesem Grund ist das Initialisieren von Variablen eine sehr gute Vorgehensweise.