Die Vielseitigkeit und Benutzerfreundlichkeit machen es zu einer der weltweit am häufigsten verwendeten Sprachen für Webprojekte, angefangen von einfachen Kontaktformularen bis hin zu großen Anwendungen in den Anfängen als Facebook .
Das Problem der Vielseitigkeit und Benutzerfreundlichkeit besteht darin, dass der Entwickler nicht gezwungen ist, sicheren Code zu schreiben. Wenn der Code nicht über sehr unsichere Funktionen verfügt, funktioniert er einwandfrei, und genau hier liegen die Probleme.
Sicherheit von Webanwendungen
Die Sicherheit von Webanwendungen ist etwas, das in PHP nicht von Anfang an vorhanden ist. Dies macht es jedoch nicht zu einer unsicheren Sprache, da die Sicherheit einer Reihe von Techniken und Arbeitsstilen entspricht, die ein Programmierer kennen muss, um sie anwenden zu können Ihre Skripte
Die Schlüssel zum Erreichen der Sicherheit in unseren PHP- Anwendungen sind: Steuern und Debuggen der vom Benutzer in das Formular eingegebenen Daten, Überprüfen der Herkunft der von unserer Anwendung empfangenen HTTP- Anforderungen und Vermeiden der direkten Ausführung von Anweisungen über Formulare.
Datenfilterung
Es gibt eine Regel in der Programmierung und sie ist universell, das heißt, sie gilt nicht nur für PHP . Alle Daten, die nicht von der Anwendung generiert werden, sind potenziell bösartig. Das bedeutet, wenn es sich nicht um ein Ergebnis handelt, das wir haben programmiert können wir nicht trauen.
Dieses Prinzip gilt für Formularwerte, Dateien und Datenbanken . Ein erster Schritt zur Verbesserung unserer Sicherheit besteht darin, Daten zu filtern, wenn wir mit diesen Elementen interagieren müssen.
Wir werden einige der Best Practices auflisten, die wir anwenden können, wenn wir die Daten filtern, die in unser Formular eingegeben werden:
Arten der Filterung
Es gibt zwei Arten der Filterung, die wir durchführen können: die erste von Werten, die wir kennen, und die zweite von Werten, die wir nicht kennen.
Die erste ist sehr einfach durchzuführen, wir sollten nur Routinen mit Listen bekannter Elemente durchführen und mit diesen vergleichen, dies ist jedoch umständlich und in größeren Anwendungen schwierig durchzuführen. Die zweite besteht darin, Routinen zu erstellen, die die Struktur des Werts auswerten. Wenn diese der von uns als sicher erachteten Struktur entsprechen, lassen wir sie an die Verarbeitung weiterleiten. Andernfalls wird ein Fehler ausgegeben, der dynamischer Natur ist. Dies ist das empfohlene Format.
Nachfolgend sehen wir einen Beispielcode für den ersten Filtertyp:
Im folgenden Code sehen wir, wie wir ein Formular erstellen, das ein Auswahlelement für den Benutzer zum Auswählen einer Farbe enthält, da der Benutzer die einzugebenden Daten nicht direkt schreiben muss. Dies kann jedoch zu dem Fehler führen, dass die Informationen nicht validiert werden Wir haben eine Sicherheitslücke, weil wir mit einem Formular mit denselben Namen potenziell gefährliche Informationen erhalten können.
Aus diesem Grund wertet unser Skript die möglichen Werte aus, sobald der Wert des Formulars über POST gesendet wurde. Wenn dies einer der erwarteten Werte ist, übergeben wir ihn an unsere sichere Werteanordnung, wie unten dargestellt.
Damit haben wir das Problem auf einfache Weise gelöst. Wenn die Liste jedoch statt drei Farben hundert Farben hätte, wäre die Geschichte der Einfachheit anders verlaufen.
Im folgenden Beispiel werden wir ein vom Benutzer eingegebenes Feld in geeigneter Weise dynamisch validieren. Hierzu müssen wir reguläre Ausdrücke verwenden und auf diese Weise die Eingabe von Zeichen vermeiden, die unsere Verarbeitung gefährden, sowie die Größe der Eingabe auswerten und somit vermeiden Ein Überlauf oder eine Überlastung unseres Datentyps bei der Abarbeitung des Programms. Sehen wir uns den Code im Bild an:
Hier ist der Schlüssel, um eine Validierung zu erreichen, zu wissen, dass wir verarbeiten möchten. Im Fall eines Benutzernamens werden normalerweise alphanumerische Zeichen und Bindestriche abgefragt. Aus diesem Grund müssen wir dies im regulären Ausdruck validieren und es muss auch höher sein dass 0 Zeichen und maximal 32, wenn die Eingabe durch den Benutzer all dies erfüllt, geschieht die Validierung, das Beste von allem ist, dass dies mit einem Wert wie hundert funktioniert, da es völlig dynamisch ist.
Schutz vor Skripten von anderen Websites
Eine weitere Bedrohung, vor der wir uns schützen müssen, ist die Ausführung von Skripten von anderen Sites. Dank AJAX können wir Formulare vom Client an eine Route senden, einschließlich der Art der Anforderung und der gewünschten Werte.
Um dieses Problem zu vermeiden, müssen wir ein System von Token und Sitzungen einrichten, damit beim Senden des Formulars geprüft wird, ob die Sitzung mit der auf sichere Weise eingerichteten Sitzung identisch ist und der böswillige Benutzer nicht fortfahren kann.
SQL Injection
Ein wichtiges Ziel eines Angreifers ist es, seinen Code in unsere Umgebung einzufügen. Dazu verwenden sie SQL- Code-Injections. Dieser Angriff wird als SQL-Injection bezeichnet. Bei unsicheren Formularen und unangemessener Verarbeitung können wir SQL-Anweisungen direkt ohne SQL-Injections empfangen Grenzen. Zum Beispiel, wenn unsere SQL- Bewertung in unserem PHP- Skript wie folgt lautet:
Wir können jeden Benutzer des Systems als Benutzernamen verwenden und für das Kennwort zwei Bindestriche “-” verwenden. Damit können wir die Sicherheit problemlos übergeben, da zwei Skripte ein SQL- Kommentar sind und das Kennwort daher nicht ausgewertet wird.
Die richtige Methode zum Bewerten einer SQL , die vom Benutzer stammt, besteht darin, die speziellen und gefährlichen Zeichen zu entfernen und nur sichere Ausdrücke zu bewerten. Nachfolgend sehen wir ein Beispiel, wie Sie den vorherigen Fall vermeiden können:
Das erste, was wir tun müssen, ist, die Daten zu bereinigen , dh zu vermeiden, dass sie rein aus dem Formular in unser SQL gelangen . Die zweite Sache, die wir bewerten müssen, ist, dass, wenn die beiden Werte dem Zugriff entsprechen, aber dieser letzte der Logik jedes einzelnen entspricht, wir im Bild sehen, wie wir das Ziel erreichen:
Hier haben wir das vorbereitete Anweisungstool verwendet, mit dem wir die PDO- Bibliothek für die Verbindung mit der Datenbank verwenden können. Dadurch erreichen wir, dass das, was eingegeben wird, niemals in einem anderen Kontext genommen wird, der keine Daten ist, sondern stattdessen Mit der POST- Methode, die wir für unser sicheres Array verwendet haben, sind unsere Daten bereits bewiesen, sodass das Risiko geringer ist.
Damit haben wir dieses Lernprogramm abgeschlossen, da wir sehen, dass die Maßnahmen, die wir ergreifen können, um unsere Anwendung sicherer zu machen, einfach sind und keine Anstrengungen für den Menschen erfordern. Sie helfen uns jedoch, die häufigsten und möglicherweise die am häufigsten auftretenden Angriffe zu vermeiden sie sind gegeben Es gibt eine schlechte Vorstellung über PHP von denen, die sagen, es sei eine unsichere Sprache, aber die Realität ist, dass die Unsicherheit vom Programmierer verursacht wird, da die Sprache nur Tools enthält, mit denen wir Angriffe auf unsere Anwendungen durch Daten verbessern und vermeiden können, die Geben Sie den Benutzer ein.