Verhindert JavaScript-Injektionen in einer PHP-Webanwendung

8

Welche Maßnahmen sind erforderlich, um JavaScript-Injektionen in einer PHP-Webanwendung zu verhindern oder zu stoppen, damit keine sensiblen Informationen ausgegeben werden (Best Practices in PHP, HTML / XHTML und JavaScript)?

    
Alerty 20.07.2010, 23:51
quelle

4 Antworten

6

Ein guter erster Schritt ist die Anwendung der Methoden, die in der Frage Gert aufgeführt sind G verknüpft . Dies umfasst detailliert die Vielzahl von Funktionen, die in verschiedenen Situationen zum Reinigen von Eingaben verwendet werden können, einschließlich mysql_real_escape_string , htmlentities() , htmlspecialchars() , strip_tags() und addslashes()

Wenn möglich, ist es besser, Benutzereingaben nicht direkt in Ihre Datenbank einzufügen. Setzen Sie Validierung der Whitelist-Eingabe ein: Wählen Sie in allen Situationen, in denen Sie nur eine begrenzte Auswahl an Optionen haben, aus kodierte Werte für die Einfügung, anstatt die Eingabe von irgendeiner clientseitig zugewandten Form zu nehmen. Grundsätzlich bedeutet dies, dass Sie nur bestimmte Werte haben, die Sie akzeptieren, anstatt zu versuchen, böse / falsch geformte / böswillige Eingaben zu eliminieren.

Zum Beispiel: Wenn Sie ein Formular mit einer Dropdown-Liste für Elemente haben, verwenden Sie die Eingabe aus diesem Dropdown-Feld nicht zum Einfügen. Denken Sie daran, dass ein böswilliger Client die mit der Einreichung des Formulars gesendeten Informationen bearbeiten kann, selbst wenn Sie der Meinung sind, dass diese nur eingeschränkte Optionen haben. Lassen Sie die Dropdown-Liste stattdessen auf einen Index in einem Array in Ihrem serverseitigen Code verweisen. Verwenden Sie dann dieses Array, um auszuwählen, was eingefügt werden soll. Auf diese Weise trifft ein Angreifer, selbst wenn er versucht, Ihnen schädlichen Code zu senden, niemals Ihre Datenbank.

Offensichtlich funktioniert das nicht für Freiformanwendungen wie Foren oder Blogs. Für diese müssen Sie auf die Techniken des "ersten Schrittes" zurückgreifen. Dennoch gibt es eine breite Palette von Optionen, die durch Validierung der Whitelist-Eingabe verbessert werden können.

Sie können auch parametrisierte Abfragen (auch vorbereitete Anweisungen mit Bind-Variablen) verwenden ) für Ihre SQL-Interaktionen, wo immer möglich. Dadurch wird Ihrem Datenbankserver mitgeteilt, dass alle Eingaben einfach ein Wert sind. Dadurch werden viele der möglichen Probleme durch Injektionsattacken gemildert. In vielen Situationen kann dies sogar für Freiformanwendungen gelten.

    
Jeffrey Blake 21.07.2010, 00:00
quelle
6

Behandle jeden von dir ausgegebenen Wert mit htmlspecialchars () mit Standard .

Nur eine Entschuldigung, htmlspecialchars () nicht zu verwenden, ist, wenn Sie eine html-Zeichenfolge ausgeben müssen, die html enthält. In diesem Fall müssen Sie sicherstellen, dass diese Zeichenfolge aus einer völlig sicheren Quelle stammt. Wenn Sie kein solches Vertrauen haben, müssen Sie es über einen Whitelist-HTML-Filter übergeben, der nur eine sorgfältig begrenzte Menge von Tags, Attributen und Attributwerten zulässt. Sie sollten besonders auf Attributwerte achten. Sie sollten niemals zulassen, dass alles als Attributwert übergeben wird, insbesondere für Attribute wie src, hef, style.

Sie sollten alle Orte in Ihrer Webanwendung kennen, in denen Sie alles auf HTML ausgeben, ohne htmspeciachars () zu verwenden. Achten Sie darauf, dass Sie diese Orte wirklich brauchen und dass Sie trotz aller Zuversicht potentielle Schwachstellen haben.

Wenn Sie denken, dass dies zu viel Vorsicht ist: "Warum muss ich htmlspecialchar () diese Variable, von der ich weiß, dass es nur Integer enthält und alle wertvollen CPU-Zyklen verlieren?"

Denken Sie daran: Sie wissen nicht, Sie denken nur, Sie wissen, CPU-Zyklen sind die billigste Sache der Welt und fast alle von ihnen werden vergeudet, indem sie auf Datenbank- oder Dateisystem- oder sogar Speicherzugriff warten.

Benutze auch niemals Blacklist-HTML-Filter. Youtube hat diesen Fehler gemacht und jemand hat plötzlich herausgefunden, dass nur der erste <script> entfernt wird und wenn Sie den zweiten Kommentar eingeben, können Sie Javascript in den Browser des Besuchers einfügen.

Um SQL-Injections zu vermeiden, behandeln Sie mit mysql_real_escape_string () alle Werte, die Sie an die SQL-Abfrage kleben, oder noch besser PDO Prepared-Anweisungen.

    
Kamil Szot 21.07.2010 00:38
quelle
4

Wenn Sie nichts weiterleiten, das als HTML formatiert werden muss, verwenden Sie:

%Vor%

und führen Sie dann Folgendes aus, um vor dem Speichern in der db

zu bereinigen %Vor%

Wenn Ihr Ajax Benutzer eingegebenen HTML über eine Textbox oder WYSIWYG speichert, dann schauen Sie sich HTMLPurifier an, um JavaScript zu entfernen, aber HTML-Tags zu erlauben.

    
Tim Santeford 21.07.2010 00:15
quelle
2
___ qstntxt ___

Welche Maßnahmen sind erforderlich, um JavaScript-Injektionen in einer PHP-Webanwendung zu verhindern oder zu stoppen, damit keine sensiblen Informationen ausgegeben werden (Best Practices in PHP, HTML / XHTML und JavaScript)?

    
___ qstnhdr ___ Verhindert JavaScript-Injektionen in einer PHP-Webanwendung ___ answer3295488 ___

Behandle jeden von dir ausgegebenen Wert mit htmlspecialchars () mit Standard .

Nur eine Entschuldigung, htmlspecialchars () nicht zu verwenden, ist, wenn Sie eine html-Zeichenfolge ausgeben müssen, die html enthält. In diesem Fall müssen Sie sicherstellen, dass diese Zeichenfolge aus einer völlig sicheren Quelle stammt. Wenn Sie kein solches Vertrauen haben, müssen Sie es über einen Whitelist-HTML-Filter übergeben, der nur eine sorgfältig begrenzte Menge von Tags, Attributen und Attributwerten zulässt. Sie sollten besonders auf Attributwerte achten. Sie sollten niemals zulassen, dass alles als Attributwert übergeben wird, insbesondere für Attribute wie src, hef, style.

Sie sollten alle Orte in Ihrer Webanwendung kennen, in denen Sie alles auf HTML ausgeben, ohne htmspeciachars () zu verwenden. Achten Sie darauf, dass Sie diese Orte wirklich brauchen und dass Sie trotz aller Zuversicht potentielle Schwachstellen haben.

Wenn Sie denken, dass dies zu viel Vorsicht ist: "Warum muss ich htmlspecialchar () diese Variable, von der ich weiß, dass es nur Integer enthält und alle wertvollen CPU-Zyklen verlieren?"

Denken Sie daran: Sie wissen nicht, Sie denken nur, Sie wissen, CPU-Zyklen sind die billigste Sache der Welt und fast alle von ihnen werden vergeudet, indem sie auf Datenbank- oder Dateisystem- oder sogar Speicherzugriff warten.

Benutze auch niemals Blacklist-HTML-Filter. Youtube hat diesen Fehler gemacht und jemand hat plötzlich herausgefunden, dass nur der erste preg_replace("/[^A-Za-z0-9]/", '', $string); entfernt wird und wenn Sie den zweiten Kommentar eingeben, können Sie Javascript in den Browser des Besuchers einfügen.

Um SQL-Injections zu vermeiden, behandeln Sie mit mysql_real_escape_string () alle Werte, die Sie an die SQL-Abfrage kleben, oder noch besser PDO Prepared-Anweisungen.

    
___ answer3295330 ___

Ein guter erster Schritt ist die Anwendung der Methoden, die in der Frage Gert aufgeführt sind G verknüpft . Dies umfasst detailliert die Vielzahl von Funktionen, die in verschiedenen Situationen zum Reinigen von Eingaben verwendet werden können, einschließlich %code% , %code% , %code% , %code% und %code%

Wenn möglich, ist es besser, Benutzereingaben nicht direkt in Ihre Datenbank einzufügen. Setzen Sie Validierung der Whitelist-Eingabe ein: Wählen Sie in allen Situationen, in denen Sie nur eine begrenzte Auswahl an Optionen haben, aus kodierte Werte für die Einfügung, anstatt die Eingabe von irgendeiner clientseitig zugewandten Form zu nehmen. Grundsätzlich bedeutet dies, dass Sie nur bestimmte Werte haben, die Sie akzeptieren, anstatt zu versuchen, böse / falsch geformte / böswillige Eingaben zu eliminieren.

Zum Beispiel: Wenn Sie ein Formular mit einer Dropdown-Liste für Elemente haben, verwenden Sie die Eingabe aus diesem Dropdown-Feld nicht zum Einfügen. Denken Sie daran, dass ein böswilliger Client die mit der Einreichung des Formulars gesendeten Informationen bearbeiten kann, selbst wenn Sie der Meinung sind, dass diese nur eingeschränkte Optionen haben. Lassen Sie die Dropdown-Liste stattdessen auf einen Index in einem Array in Ihrem serverseitigen Code verweisen. Verwenden Sie dann dieses Array, um auszuwählen, was eingefügt werden soll. Auf diese Weise trifft ein Angreifer, selbst wenn er versucht, Ihnen schädlichen Code zu senden, niemals Ihre Datenbank.

Offensichtlich funktioniert das nicht für Freiformanwendungen wie Foren oder Blogs. Für diese müssen Sie auf die Techniken des "ersten Schrittes" zurückgreifen. Dennoch gibt es eine breite Palette von Optionen, die durch Validierung der Whitelist-Eingabe verbessert werden können.

Sie können auch parametrisierte Abfragen (auch vorbereitete Anweisungen mit Bind-Variablen) verwenden ) für Ihre SQL-Interaktionen, wo immer möglich. Dadurch wird Ihrem Datenbankserver mitgeteilt, dass alle Eingaben einfach ein Wert sind. Dadurch werden viele der möglichen Probleme durch Injektionsattacken gemildert. In vielen Situationen kann dies sogar für Freiformanwendungen gelten.

    
___ answer3295393 ___

Wenn Sie nichts weiterleiten, das als HTML formatiert werden muss, verwenden Sie:

%Vor%

und führen Sie dann Folgendes aus, um vor dem Speichern in der db

zu bereinigen %Vor%

Wenn Ihr Ajax Benutzer eingegebenen HTML über eine Textbox oder WYSIWYG speichert, dann schauen Sie sich HTMLPurifier an, um JavaScript zu entfernen, aber HTML-Tags zu erlauben.

    
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___ antwort43125931 ___

Ich stimme den anderen Antworten nicht vollständig zu, daher werde ich meine Empfehlungen veröffentlichen.

Empfohlenes Lesen XSS_ (Cross_Site_Scripting) _Prevention_Cheat_Sheet

Html-Injektion: Wann immer ein von Nutzern eingereichter Inhalt angezeigt wird, sollte dieser entsprechend mit htmlspecialchars oder htmlentities , wenn ENT_QUOTES angegeben wird, wenn sie in einfachen Anführungszeichen verwendet wird. Ich würde empfehlen, niemals in einfache Anführungszeichen zu kapseln und Ihre Attribute immer in doppelte Anführungszeichen zu kapseln (nicht weglassen). Dies gilt für Dinge wie:

%Vor%

Javascript-Injektion: Es ist bewährte Methode (aber nicht immer praktisch), Benutzerinhalte niemals in Ereignisse und Javascript zu übertragen. Wenn Sie jedoch tun, gibt es einige Dinge, die getan werden können, um das Risiko zu reduzieren. Nur Integer-IDs übergeben. Wenn Sie beispielsweise einen Typspezifizierer benötigen, verwenden Sie vor der Ausgabe eine Whitelist und / oder eine bedingte Überprüfung vor der Zeit. Ändern Sie Benutzerinhalte möglicherweise nur dann in alphanumerische Zeichen, wenn dies sinnvoll ist. %code% aber sei sehr vorsichtig, was du hier erlaubst. Fügen Sie Inhalte nur dann ein, wenn sie in Anführungszeichen eingeschlossen sind, und beachten Sie, dass htmlspecialchars / htmlentities Sie hier nicht schützt. Es wird zur Laufzeit interpretiert, auch wenn es in HTML-Entitäten übersetzt wurde. Dies gilt für Dinge wie:

%Vor%

Widerhallen Sie Benutzerinhalte nicht in anderen Bereichen wie dem Textkörper von Skript-Tags usw., es sei denn, sie wurden zu einem int oder einem anderen sehr sehr begrenzten Zeichensatz gezwungen (wenn Sie wissen, was Sie tun).

SQL-Injektion: Verwenden Sie vorbereitete Anweisungen , binden Sie Benutzerinhalte an sie, und fügen Sie Benutzerinhalte niemals direkt in das Web ein Abfrage. Ich würde empfehlen, eine Klasse für vorbereitete Anweisungen mit Hilfsfunktionen für Ihre verschiedenen grundlegenden Anweisungstypen zu erstellen (und dabei alle Datenbankanweisungen zu funktionalisieren). Wenn Sie keine vorbereiteten Anweisungen verwenden möchten, verwenden Sie mysql_real_escape_string () oder ähnliche ( nicht addslashes ()). Überprüfen Sie den Inhalt, wenn möglich, bevor Sie ihn in der Datenbank speichern, z. B. Erzwingen / Prüfen auf Ganzzahldatentyp, bedingte Überprüfung von Typen usw. Verwenden Sie geeignete Datenbankspaltentypen und -längen. Denken Sie daran, das Hauptziel hier ist, sql Injektion zu verhindern, aber Sie können optional auch hier HTML / Javascript-Injektion Schutz tun.

Weitere Ressourcen Ich habe online recherchiert, um eine einfache Lösung zu finden, die bereits öffentlich verfügbar ist. Ich fand OWASP ESAPI, aber es scheint ziemlich veraltet. Die Links zur PHP-Version sind an mehreren Stellen unterbrochen. Ich glaube, ich habe es hier gefunden. ESAPI PHP aber wieder ist es ziemlich veraltet und nicht so einfach, wie ich es mir erhofft hatte. Sie können es jedoch nützlich finden.

Alles in allem, nehmen Sie nicht einfach an, dass Sie geschützt sind, wie zum Beispiel htmlentities in einem onClick-Attribut. Sie müssen das richtige Werkzeug an der richtigen Stelle verwenden und Dinge am falschen Ort vermeiden.

    
___ tag123javascriptinjection ___ JavaScript-Injection ist ein Prozess, mit dem wir unseren eigenen JavaScript-Code in eine Seite einfügen und verwenden können. ___
vdidxho 30.03.2017 18:39
quelle