Halt!
Du machst hier einen Fehler. Oh nein, Sie haben die richtigen PHP-Funktionen ausgewählt, um Ihre Daten ein bisschen sicherer zu machen. Das ist gut. Ihr Fehler liegt in der Reihenfolge der Operationen und wie und wo diese Funktionen verwendet werden sollen.
Es ist wichtig, den Unterschied zwischen der Bereinigung und Validierung von Benutzerdaten, dem Entkommen von Daten zur Speicherung und dem Entkommen von Daten zur Präsentation zu verstehen.
Benutzerdaten bereinigen und validieren
Wenn Benutzer Daten übermitteln, müssen Sie sicherstellen, dass sie etwas bereitgestellt haben, das Sie erwarten.
Desinfektion und Filterung
Wenn Sie beispielsweise eine Nummer erwarten, stellen Sie sicher, dass die übermittelten Daten eine Nummer sind . Sie können Benutzerdaten auch in andere Typen umwandeln. Alles, was übermittelt wird, wird anfangs wie eine Zeichenfolge behandelt. Wenn Sie also wissen, dass numerische Daten eine Ganzzahl oder ein Gleitkommawert sind, ist die Bereinigung schnell und problemlos.
Was ist mit Freiform-Textfeldern und Textbereichen? Sie müssen sicherstellen, dass in diesen Feldern nichts Unerwartetes vorhanden ist. Hauptsächlich müssen Sie sicherstellen, dass Felder, die keinen HTML-Inhalt enthalten sollten, kein HTML enthalten. Es gibt zwei Möglichkeiten, wie Sie mit diesem Problem umgehen können.
Zunächst können Sie versuchen , HTML-Eingaben mit zu umgehen htmlspecialchars
. Sie sollten htmlentities
HTML nicht zum Neutralisieren verwenden, da es auch die Codierung von akzentuierten und anderen Zeichen ausführt, von denen es glaubt, dass sie ebenfalls codiert werden müssen.
Zweitens können Sie versuchen , jegliches mögliche HTML zu entfernen . strip_tags
ist schnell und einfach, aber auch schlampig. HTML Purifier erledigt viel gründlicher sowohl das Entfernen von HTML als auch das Durchführen einer selektiven Whitelist von Tags und Attributen.
Moderne PHP-Versionen werden mit der Filtererweiterung geliefert , die eine umfassende Möglichkeit bietet, Benutzereingaben zu bereinigen.
Validierung
Es ist nur die Hälfte des Auftrags, sicherzustellen, dass die übermittelten Daten frei von unerwarteten Inhalten sind. Sie müssen auch versuchen, sicherzustellen, dass die übermittelten Daten Werte enthalten, mit denen Sie tatsächlich arbeiten können.
Wenn Sie eine Zahl zwischen 1 und 10 erwarten, müssen Sie diesen Wert überprüfen. Wenn Sie eine dieser neuen ausgefallenen numerischen Eingaben aus der HTML5-Ära mit einem Drehfeld und Schritten verwenden, stellen Sie sicher, dass die übermittelten Daten mit dem Schritt übereinstimmen.
Wenn diese Daten aus einem Dropdown-Menü stammen, stellen Sie sicher, dass der übermittelte Wert im Menü angezeigt wird.
Was ist mit Texteingaben, die andere Anforderungen erfüllen? Beispielsweise sollten Datumseingaben über strtotime
oder die DateTime-Klasse validiert werden . Das angegebene Datum sollte zwischen den erwarteten Bereichen liegen. Was ist mit E-Mail-Adressen? Die zuvor erwähnte Filtererweiterung kann prüfen, ob eine Adresse wohlgeformt ist , obwohl ich ein Fan von bin die is_email Bibliothek .
Gleiches gilt für alle anderen Formularsteuerelemente. Haben Sie Optionsfelder? Validieren Sie anhand der Liste. Kontrollkästchen haben? Validieren Sie anhand der Liste. Haben Sie eine Datei hochgeladen? Stellen Sie sicher, dass die Datei vom erwarteten Typ ist, und behandeln Sie den Dateinamen wie ungefilterte Benutzerdaten.
Jeder moderne Browser verfügt über einen vollständigen Satz integrierter Entwicklertools, sodass jeder Ihr Formular problemlos bearbeiten kann. Ihr Code sollte davon ausgehen, dass der Benutzer alle clientseitigen Einschränkungen für den Formularinhalt vollständig aufgehoben hat !
Escape-Daten zur Speicherung
Nachdem Sie sichergestellt haben, dass Ihre Daten das erwartete Format haben und nur die erwarteten Werte enthalten, müssen Sie sich Sorgen machen, dass diese Daten gespeichert bleiben.
Jeder einzelne Datenspeichermechanismus verfügt über eine bestimmte Methode, um sicherzustellen, dass Daten ordnungsgemäß maskiert und codiert werden. Wenn Sie SQL erstellen, werden Daten in Abfragen über vorbereitete Anweisungen mit Platzhaltern übergeben .
Eine der besseren Möglichkeiten, mit den meisten SQL-Datenbanken in PHP zu arbeiten, ist die PDO-Erweiterung . Es folgt dem üblichen Muster, eine Anweisung vorzubereiten , Variablen an die Anweisung zu binden und dann die Anweisung und die Variablen an den Server zu senden . Wenn Sie noch nie mit PDO gearbeitet haben, finden Sie hier ein ziemlich gutes MySQL-orientiertes Tutorial .
Einige SQL-Datenbanken haben ihre eigenen speziellen Erweiterungen in PHP, einschließlich SQL Server , PostgreSQL und SQLite 3 . Jede dieser Erweiterungen verfügt über eine vorbereitete Anweisungsunterstützung, die auf dieselbe Weise wie PDO vorbereitet, gebunden und ausgeführt wird. Manchmal müssen Sie diese Erweiterungen anstelle von PDO verwenden, um nicht standardmäßige Funktionen oder Verhaltensweisen zu unterstützen.
MySQL hat auch eigene PHP-Erweiterungen. Zwei davon tatsächlich. Sie möchten immer nur das mit dem Namen mysqli verwenden . Die alte "mysql" -Erweiterung ist veraltet und in der modernen Zeit weder sicher noch vernünftig zu verwenden.
Ich persönlich bin kein Fan von Mysqli. Die Art und Weise, wie vorbereitete Anweisungen variabel gebunden werden, ist unflexibel und kann schmerzhaft sein. Verwenden Sie im Zweifelsfall stattdessen PDO.
Wenn Sie keine SQL-Datenbank zum Speichern Ihrer Daten verwenden, überprüfen Sie die Dokumentation der verwendeten Datenbankschnittstelle, um festzustellen, wie Daten sicher durch sie übertragen werden können.
Stellen Sie nach Möglichkeit sicher, dass Ihre Datenbank Ihre Daten in einem geeigneten Format speichert. Speichern Sie Zahlen in numerischen Feldern. Speichern Sie Daten in Datumsfeldern. Speichern Sie Geld in einem Dezimalfeld, nicht in einem Gleitkommafeld. Lesen Sie in der von Ihrer Datenbank bereitgestellten Dokumentation nach, wie verschiedene Datentypen ordnungsgemäß gespeichert werden.
Daten für die Präsentation entziehen
Jedes Mal, wenn Sie Benutzern Daten anzeigen, müssen Sie sicherstellen, dass die Daten sicher maskiert werden, es sei denn, Sie wissen, dass sie nicht maskiert werden sollten.
Wenn Sie HTML ausgeben, sollten Sie fast immer alle Daten übergeben, die ursprünglich vom Benutzer bereitgestellt wurden htmlspecialchars
. Tatsächlich sollten Sie dies nur dann nicht tun, wenn Sie wissen, dass der Benutzer HTML bereitgestellt hat und dass Sie wissen, dass es bereits mithilfe einer Whitelist bereinigt wurde.
Manchmal müssen Sie Javascript mit PHP generieren. Javascript hat nicht die gleichen Escape-Regeln wie HTML! Ein sicherer Weg, um vom Benutzer bereitgestellte Werte für Javascript über PHP bereitzustellen, ist durch json_encode
.
Und mehr
Die Datenvalidierung weist viel mehr Nuancen auf.
Beispielsweise kann die Zeichensatzcodierung eine große Falle sein . Ihre Anwendung sollte den in " UTF-8 bis zum Ende " beschriebenen Vorgehensweisen folgen . Es gibt hypothetische Angriffe, die auftreten können, wenn Sie Zeichenfolgendaten als falschen Zeichensatz behandeln.
Früher habe ich Browser-Debug-Tools erwähnt. Diese Tools können auch zum Bearbeiten von Cookie-Daten verwendet werden. Cookies sollten als nicht vertrauenswürdige Benutzereingaben behandelt werden .
Datenvalidierung und Escape-Funktion sind nur ein Aspekt der Sicherheit von Webanwendungen. Sie sollten sich mit den Angriffsmethoden für Webanwendungen vertraut machen, damit Sie Schutzmaßnahmen gegen diese aufbauen können.