Heim  >  Artikel  >  Backend-Entwicklung  >  Gängige Angriffsmethoden auf PHP-Websites

Gängige Angriffsmethoden auf PHP-Websites

小云云
小云云Original
2018-03-26 10:18:384777Durchsuche

Zu den häufigsten Sicherheitsbedrohungen bei der Erstellung von PHP-Websites gehören: SQL-Injection, Manipulation von GET- und POST-Variablen, Pufferüberlaufangriffe, Cross-Site-Scripting-Angriffe, Datenmanipulation im Browser und Remote-Formularübermittlung.

1. SQL-Injection-Angriffe verhindern

Bei SQL-Injection-Angriffen fügen Benutzer Informationen zu Datenbankabfragen hinzu, indem sie Formulare oder GET-Abfragezeichenfolgen manipulieren.

Stellen Sie sich zum Beispiel eine einfache Login-Datenbank vor. Jeder Datensatz in dieser Datenbank verfügt über ein Benutzernamenfeld und ein Passwortfeld. Erstellen Sie ein Anmeldeformular, um Benutzern die Anmeldung zu ermöglichen.

Die Lösung für dieses Problem besteht darin, die in PHP integrierte mysql_real_escape_string()-Funktion als Wrapper um jede Benutzereingabe zu verwenden.

Diese Funktion maskiert Zeichen in einer Zeichenfolge, sodass die Zeichenfolge keine Sonderzeichen wie Apostrophe übergeben kann und MySQL auf der Grundlage der Sonderzeichen arbeiten kann. Listing 7 zeigt den Escape-Code.

2. Verhindern Sie, dass Benutzer Variablen manipulieren

Nur ​​weil ein Benutzer ein gültiges Passwort hat, heißt das nicht, dass er sich an die Regeln hält – er hat viele Möglichkeiten, Schaden anzurichten. Beispielsweise könnte eine Anwendung es Benutzern ermöglichen, spezielle Inhalte anzuzeigen.

Zum Beispiel template.php?pid=33 oder template.php?pid=321. Der Teil der URL nach dem Fragezeichen wird als Abfragezeichenfolge bezeichnet. Da die Abfragezeichenfolge direkt in der URL platziert wird, wird sie auch als GET-Abfragezeichenfolge bezeichnet.

Stimmt hier etwas nicht?

Erstens besteht die implizite Annahme, dass die GET-Variable pid vom Browser sicher ist.

Was wird passieren?

Die meisten Benutzer sind nicht schlau genug, um semantische Angriffe zu konstruieren. Wenn sie jedoch pid=33 im URL-Speicherortfeld des Browsers bemerken, könnten sie Probleme verursachen.

Wenn sie eine andere Zahl eingeben, ist das wahrscheinlich in Ordnung; wenn sie jedoch etwas anderes eingeben, wie einen SQL-Befehl oder den Namen einer Datei (wie /etc/passwd) oder einen anderen Unfug wie „Einen Wert eingeben“. bis zu 3.000 Zeichen lang, und was passiert?

Denken Sie in diesem Fall an die Grundregel: Vertrauen Sie Benutzereingaben nicht.

Anwendungsentwickler wissen, dass von template.php akzeptierte persönliche Identifikatoren (PIDs) numerisch sein sollten. Sie können daher die Funktion is_numeric() von PHP verwenden, um sicherzustellen, dass nicht numerische PIDs nicht akzeptiert werden.

Alles, was Sie tun müssen, ist strlen() zu verwenden, um zu prüfen, ob die Länge der Variablen ungleich Null ist. Wenn ja, verwenden Sie einen rein numerischen regulären Ausdruck, um sicherzustellen, dass das Datenelement gültig ist. Wenn die PID Buchstaben, Schrägstriche, Punkte oder etwas enthält, das einer Hexadezimalzahl ähnelt, erfasst diese Routine dies und blockiert die Seite für Benutzeraktivitäten.

3. Pufferüberlaufangriff

Ein Pufferüberlaufangriff versucht, den Speicherzuordnungspuffer in einer PHP-Anwendung (oder genauer gesagt in Apache oder dem zugrunde liegenden Betriebssystem) zum Überlaufen zu bringen.

Denken Sie daran, dass Sie Ihre Webanwendung möglicherweise in einer Hochsprache wie PHP schreiben, aber letztendlich C aufrufen (im Fall von Apache). Wie die meisten Low-Level-Sprachen gelten in C strenge Regeln für die Speicherzuweisung.

Pufferüberlaufangriffe senden eine große Datenmenge an den Puffer, was dazu führt, dass ein Teil der Daten in benachbarte Speicherpuffer überläuft, wodurch der Puffer zerstört oder die Logik neu geschrieben wird. Dies kann zu einem Denial-of-Service, zur Beschädigung von Daten oder zur Ausführung von Schadcode auf dem Remote-Server führen.
Die einzige Möglichkeit, Pufferüberlaufangriffe zu verhindern, besteht darin, die Länge aller Benutzereingaben zu überprüfen.

Beachten Sie, dass Pufferüberlaufangriffe nicht auf lange Zahlen- oder Buchstabenfolgen beschränkt sind. Möglicherweise sehen Sie auch lange hexadezimale Zeichenfolgen (die oft wie xA3 oder xFF aussehen).

Denken Sie daran, dass das Ziel jedes Pufferüberlaufangriffs darin besteht, einen bestimmten Puffer zu überfluten und Schadcode oder Anweisungen in den nächsten Puffer zu platzieren, wodurch Daten beschädigt oder Schadcode ausgeführt wird.

Der einfachste Weg, mit einem Hex-Pufferüberlauf umzugehen, besteht darin, zu verhindern, dass Eingaben eine bestimmte Länge überschreiten.
Wenn Sie es mit einem Formulartextbereich zu tun haben, der längere Einträge in der Datenbank zulässt, gibt es auf Client-Seite keine Möglichkeit, die Länge der Daten einfach zu begrenzen. Nachdem die Daten PHP erreicht haben, können Sie reguläre Ausdrücke verwenden, um alle hexadezimalen Zeichenfolgen zu löschen.

4. Cross-Site-Scripting-Angriff

Bei einem Cross-Site-Scripting-Angriff (XSS) gibt ein böswilliger Benutzer häufig Informationen in ein Formular ein (oder über andere Benutzereingabemethoden) und diese Eingaben werden schädliche clientseitige Token in Prozesse oder Datenbanken eingefügt.

Stellen Sie sich zum Beispiel vor, Sie hätten auf Ihrer Website ein einfaches Gästebuchprogramm, das es Besuchern ermöglicht, ihren Namen, ihre E-Mail-Adresse und eine kurze Nachricht zu hinterlassen.

Ein böswilliger Benutzer könnte diese Gelegenheit nutzen, um etwas anderes als eine kurze Nachricht einzufügen, beispielsweise ein Bild, das für andere Benutzer ungeeignet ist, oder JavaScript, das den Benutzer auf eine andere Website umleitet oder Cookie-Informationen stiehlt.

Glücklicherweise bietet PHP die Funktion „strip_tags()“, mit der alle von HTML-Tags umgebenen Inhalte entfernt werden können. Die Funktion „strip_tags()“ ermöglicht auch die Bereitstellung einer Liste der zulässigen Tags.

Die Verwendung von strip_tags() für öffentliche Benutzereingaben ist aus Sicherheitsgründen notwendig. Wenn sich das Formular in einem geschützten Bereich befindet (z. B. einem Content-Management-System) und Sie darauf vertrauen, dass Benutzer ihre Aufgaben korrekt ausführen (z. B. HTML-Inhalte für eine Website erstellen), ist die Verwendung von strip_tags() möglicherweise unnötig und beeinträchtigt die Produktivität.

Es gibt noch eine weitere Frage: Wenn Sie Benutzereingaben akzeptieren möchten, z. B. Kommentare zu Beiträgen oder Gastregistrierungsartikeln, und diese Eingaben anderen Benutzern anzeigen müssen, müssen Sie die Antwort in PHPs htmlspecialchars() einfügen. in Funktion.

Diese Funktion wandelt die kaufmännischen Und-Symbole < in HTML-Entitäten um. Beispielsweise wird das kaufmännische Und-Zeichen (&) zu &. Selbst wenn der schädliche Inhalt in diesem Fall der Verarbeitung von strip_tags() im Front-End entgeht, wird er von htmlspecialchars() im Back-End verarbeitet.

5. Datenmanipulation im Browser

Es gibt eine Art Browser-Plug-in, mit dem Benutzer Kopfzeilenelemente und Formularelemente auf der Seite manipulieren können. Mit Tamper Data, einem Mozilla-Plug-in, ist es einfach, einfache Formulare mit vielen versteckten Textfeldern zu manipulieren, um Anweisungen an PHP und MySQL zu senden.

Bevor der Benutzer im Formular auf „Senden“ klickt, kann er „Manipulationsdaten“ starten. Beim Absenden des Formulars wird ihm eine Liste der Formulardatenfelder angezeigt.

Manipulationsdaten ermöglichen es dem Benutzer, diese Daten zu manipulieren, bevor der Browser die Formularübermittlung abschließt.

Der einfachste Weg, sich gegen dieses Tool zu verteidigen, besteht darin, anzunehmen, dass jeder Benutzer Tamper Data (oder ein ähnliches Tool) verwenden könnte.

Geben Sie nur die Mindestmenge an Informationen an, die das System zur Verarbeitung des Formulars benötigt, und übermitteln Sie das Formular an eine spezielle Logik. Beispielsweise sollte das Registrierungsformular nur an die Registrierungslogik übermittelt werden.

Was wäre, wenn Sie eine gemeinsame Formularverarbeitungsfunktion erstellt hätten und viele Seiten diese gemeinsame Logik verwenden?

Was wäre, wenn Sie versteckte Variablen verwenden, um den Fluss zu steuern?

Zum Beispiel kann in einer versteckten Formularvariablen angegeben werden, in welche Datenbanktabelle geschrieben werden soll oder welches Datei-Repository verwendet werden soll. Es gibt 4 Optionen:

Ändern Sie nichts und beten Sie, dass sich keine böswilligen Benutzer im System befinden.

Funktion neu schreiben, um sicherere dedizierte Formularverarbeitungsfunktionen zu verwenden und die Verwendung versteckter Formularvariablen zu vermeiden.

Verwenden Sie md5() oder andere Verschlüsselungsmechanismen, um Tabellennamen oder andere vertrauliche Informationen in versteckten Formularvariablen zu verschlüsseln. Vergessen Sie nicht, sie auf der PHP-Seite zu entschlüsseln.

Verschleieren Sie die Bedeutung von Werten durch die Verwendung von Abkürzungen oder Spitznamen und konvertieren Sie diese Werte dann in PHP-Formularverarbeitungsfunktionen. Wenn Sie beispielsweise auf die Benutzertabelle verweisen möchten, können Sie mit u oder einer beliebigen Zeichenfolge (z. B. u8y90×0jkL) darauf verweisen.

Die letzten beiden Optionen sind nicht perfekt, aber sie sind viel besser, als wenn der Benutzer die Middleware-Logik oder das Datenmodell leicht erraten muss.

6. Remote-Formularübermittlung

Der Vorteil des Webs besteht darin, dass es Informationen und Dienste teilen kann. Die Kehrseite ist das Teilen von Informationen und Dienstleistungen, denn manche Leute machen Dinge ohne Skrupel.

Nehmen Sie ein Formular als Beispiel. Jeder kann eine Website besuchen und über Datei > Speichern unter im Browser eine lokale Kopie des Formulars erstellen. Anschließend kann er den Aktionsparameter so ändern, dass er auf eine vollständig qualifizierte URL verweist (nicht auf formHandler.php, sondern auf http://www.yoursite.com/formHandler.php, da sich das Formular auf dieser Site befindet) und tun, was er möchte Wenn Sie Änderungen vornehmen, klicken Sie auf „Senden“ und der Server empfängt diese Formulardaten als legalen Kommunikationsfluss.

Zunächst sollten Sie $_SERVER['HTTP_REFERER'] überprüfen, um festzustellen, ob die Anfrage von Ihrem eigenen Server kommt. Diese Methode kann die meisten böswilligen Benutzer blockieren, nicht jedoch die raffiniertesten Hacker. Diese Leute sind schlau genug, die Referrer-Informationen im Header zu manipulieren, damit die Remote-Kopie des Formulars so aussieht, als wäre sie von Ihrem Server übermittelt worden.

Eine bessere Möglichkeit, die Remote-Formularübermittlung zu handhaben, besteht darin, ein Token basierend auf einer eindeutigen Zeichenfolge oder einem Zeitstempel zu generieren und dieses Token in die Sitzungsvariable und das Formular einzufügen. Überprüfen Sie nach dem Absenden des Formulars, ob die beiden Token übereinstimmen. Wenn es nicht übereinstimmt, wissen Sie, dass jemand versucht, Daten von einer Remote-Kopie des Formulars zu senden.

Sicherheitszusammenfassung der PHP-Website-Entwicklung:

Verwenden Sie mysql_real_escape_string(), um SQL-Injection-Probleme zu verhindern.

Verwenden Sie reguläre Ausdrücke und strlen(), um sicherzustellen, dass GET-Daten nicht manipuliert wurden.

Verwenden Sie reguläre Ausdrücke und strlen(), um sicherzustellen, dass vom Benutzer übermittelte Daten die Speicherpuffer nicht überlaufen.

Verwenden Sie strip_tags() und htmlspecialchars(), um zu verhindern, dass Benutzer potenziell schädliche HTML-Tags übermitteln.

Verhindern Sie, dass das System durch Tools wie Tamper Data verletzt wird.

Verwenden Sie ein eindeutiges Token, um zu verhindern, dass Benutzer Formulare aus der Ferne an den Server senden.

Verwandte Empfehlungen:

Häufige PHP-Sicherheitsangriffe und -Lösungen

Lösungen für mehrere gängige Angriffsmethoden bei der PHP-Website-Entwicklung

PHP-Implementierungsbeispielcode zur Verhinderung von Cross-Site- und XSS-Angriffen

Das obige ist der detaillierte Inhalt vonGängige Angriffsmethoden auf PHP-Websites. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn