2010-07-20 6 views
8

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

+1

mögliche Duplikate von [Wie Code-Injection-Angriffe in PHP zu verhindern?] (Http://stackoverflow.com/questions/1205889/how-to-prevent-code-injection-attacks-in-php) –

+0

@Gert G : Ich glaube, diese Frage betrifft SQL und XSS Injektionen ... keine JavaScript-Injektionen. – Alerty

+2

Nicht vollständige Überschneidung - diese Techniken gelten, aber es gibt andere Maßnahmen, die von den in dieser Frage vorgeschlagenen Punkten nicht abgedeckt sind. Siehe unten. –

Antwort

6

Ein guter erster Schritt ist die Anwendung der in der question Gert G linked aufgelisteten Methoden. Dies umfasst im Einzelnen die Vielfalt der Funktionen, die in verschiedenen Situationen eingesetzt werden kann Eingabe zu reinigen, einschließlich mysql_real_escape_string, htmlentities(), htmlspecialchars(), strip_tags() und addslashes()

Eine bessere Art und Weise, wann immer möglich, eingegeben Einsetzen Benutzer zu vermeiden, direkt in Ihre Datenbank . Verwenden Sie whitelist input validation: In jeder Situation, in der Sie nur eine begrenzte Auswahl an Optionen haben, wählen Sie aus fest codierten Werten für die Einfügung, anstatt die Eingabe von einem Client zugewandten Formular zu nehmen. Grundsätzlich bedeutet dies, dass Sie nur bestimmte Werte haben, die Sie akzeptieren, anstatt zu versuchen, böse/falsch geformte/bösartige Eingaben zu eliminieren.

Zum Beispiel: Wenn Sie ein Formular mit einem Dropdown für Artikel haben, verwenden Sie nicht die Eingabe aus diesem Dropdown für das 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 über die Validierung von Whitelist-Eingaben verbessert werden können.

Sie können auch parameterized queries (aka vorbereitete Anweisungen mit Bind-Variablen) für Ihre SQL-Interaktionen verwenden, wo immer dies möglich ist. 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 Freiformanwendungen abdecken.

4

Wenn alles, was das nicht vorbei, die als HTML formatiert werden muss, um dann verwenden:

strip_tags() <- Eliminates any suspicious html 

und dann folgendes zu reinigen laufen, bevor

mysql_real_escape_string() 

Wenn Ihre Ajax-Speicher auf die db Spar wird Benutzer eingegeben HTML über eine Textbox oder wysiwyg dann in HTMLPurifier suchen, um Javascript zu entfernen, aber HTML-Tags zulassen.

+0

Angenommen, in meiner CSV-Datei habe ich Spalte, in der ich Wert der Spalte wie wie kann ich dann diesen Spaltenwert entfernen und null machen –

6

Behandle jeden ausgegebenen Wert in HTML mit htmlspecialchars() von Standard.

Nur Entschuldigung für die Verwendung von htmlspecialchars() ist, wenn Sie in HTML-String ausgeben müssen, die selbst 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 Webapp kennen, wo 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, die ich weiß es enthält nur Integer und verlieren alle wertvollen CPU-Zyklen?"

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 durch warten auf Datenbank oder Dateisystem oder sogar Speicherzugriff.

Auch nie Blacklist HTML-Filter verwenden. Youtube hat diesen Fehler gemacht und jemand hat plötzlich herausgefunden, dass nur zuerst <script> entfernt wird und wenn Sie den zweiten in den Kommentar eingeben, können Sie Javascript in den Browser des Besuchers injizieren.

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

2

Ich stimme nicht vollständig mit den anderen Antworten zur Verfügung, damit ich meine Empfehlungen posten werde.

Empfohlen XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

Html Injection Lese: Jedes Mal, wenn die Anzeige jeden Benutzer bereitgestellte Inhalte, es innerhalb von einfachen Anführungszeichen in geeigneter Weise gereinigt werden soll, wenn verwendet mit htmlspecialchars oder htmlentities wenn ENT_QUOTES angeben. 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:

<input value="<?php echo htmlspecialchars($var); ?>" /> 
<textarea><?php echo htmlspecialchars($var); ?></textarea> 
<p><?php echo htmlspecialchars($var); ?></p> 
<img width="<?php echo htmlspecialchars($var); ?>" /> 

Javascript Injection: Am besten ist es Praxis (aber nicht immer praktisch) nie Echo Benutzer Inhalte in Veranstaltungen und Javascript. 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. preg_replace("/[^A-Za-z0-9]/", '', $string); 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:

<a href="www.stackoverlow.com/?id=<?php echo (int)$id; ?>">Click</a> 
href, src, style, onClick, etc. 

keine Benutzerinhalte in andere Bereiche wie der Körper von Script-Tags echo Sie etc, wenn es in einem int oder einem anderen sehr, sehr begrenzten Zeichensatz gezwungen wurde (wenn du weißt, was du tust).

SQL Injection: Verwenden Prepared statements, binden Benutzerinhalte zu ihnen, und nie direkt Benutzer Inhalte in die Abfrage einfügen. 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 ähnliches (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.

Andere Ressourcen Ich habe einige Online-Recherchen durchgeführt, 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 gehen Sie nicht nur davon aus, 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.