Was sind die besten Methoden zur Vermeidung von XSS-Angriffen auf einer PHP-Site?

StackOverflow https://stackoverflow.com/questions/71328

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe PHP so konfiguriert, dass magische Anführungszeichen aktiviert und Register-Globals deaktiviert sind.

Ich gebe mein Bestes, immer htmlentities() für alles aufzurufen, was ich ausgebe und das von Benutzereingaben abgeleitet ist.

Gelegentlich durchsuche ich meine Datenbank auch nach allgemeinen Dingen, die in XSS-Anhängen verwendet werden, wie zum Beispiel ...

<script

Was sollte ich sonst noch tun und wie kann ich sicherstellen, dass die Dinge, die ich versuche, auch so sind? stets Erledigt.

War es hilfreich?

Lösung

Das Escapen von Eingaben ist nicht das Beste, was Sie für eine erfolgreiche XSS-Prävention tun können.Außerdem muss die Ausgabe maskiert werden.Wenn Sie die Smarty-Vorlagen-Engine verwenden, können Sie Folgendes verwenden: |escape:'htmlall' Modifikator zum Konvertieren aller sensiblen Zeichen in HTML-Entitäten (ich verwende eigene |e Modifikator, der ein Alias ​​für den oben genannten ist).

Mein Ansatz zur Eingabe-/Ausgabesicherheit ist:

  • Benutzereingaben nicht geändert speichern (kein HTML-Escape bei der Eingabe, nur DB-fähiges Escape über PDO-vorbereitete Anweisungen)
  • Escape bei der Ausgabe, abhängig davon, welches Ausgabeformat Sie verwenden (z. B.HTML und JSON benötigen unterschiedliche Escape-Regeln)

Andere Tipps

Ich bin der Meinung, dass man nicht alles während der Eingabe entweichen sollte, nur auf die Produktion. Da (die meiste Zeit) Sie können nicht davon ausgehen, dass Sie wissen, wo diese Daten gehen. Wenn Sie beispielsweise Formular, das Daten erfolgt, die später erscheint auf einer E-Mail, die Sie aussenden, müssen Sie verschiedene escaping (sonst ein böswilliger Benutzer Ihre E-Mail-Header umschreiben könnte).

Mit anderen Worten, können Sie nur im allerletzten Moment entkommen die Daten „verlassen“ Ihre Anwendung:

  • Liste item
  • Schreiben in XML-Datei, escape für XML
  • Schreiben an die DB, escape (für diese bestimmte DBMS)
  • E-Mail schreiben, Flucht für E-Mails
  • etc

short gehen:

  1. Sie wissen nicht, wo Ihre Daten gehen
  2. Daten könnten tatsächlich in mehr als ein Ort am Ende, verschiedener Escaping Mechanismus aber nicht beide
  3. benötigen
  4. Daten entkam für das falsche Ziel ist wirklich nicht schön. (Zum Beispiel eine E-Mail mit dem Betreff bekommen "Zum Tommy \ 's Bar").

Esp # 3 tritt auf, wenn Sie Daten an der Eingangsschicht entkommen (oder Sie brauchen, um de-zu entkommen es wieder, etc).

PS: Ich werde zweitens die Beratung für nicht magic_quotes verwenden, das ist reines Böse

Es gibt eine Menge Möglichkeiten, XSS zu tun (siehe http://ha.ckers.org/xss .html ) und es ist sehr schwer zu fangen.

Ich persönlich delegieren diese auf den aktuellen Rahmen Ich verwende (Code Igniter zum Beispiel). Zwar nicht perfekt, könnte es mehr als meine Hand gemacht Routinen jemals tun fangen.

Dies ist eine große Frage.

Zuerst nicht entgehen Text auf Eingabe außer es für die Lagerung (wie wurde in eine Datenbank) sicher zu machen. Der Grund dafür ist, die Sie behalten möchten, was eingegeben wurde, so dass Sie die kontextuell es auf verschiedene Arten und Orte präsentieren können. Machen Sie hier Änderungen können später Präsentation gefährden.

Wenn Sie Ihre Daten herauszufiltern gehen zu präsentieren, was nicht da sein sollte. Zum Beispiel, wenn es nicht ein Grund für Sie Javascript um dort für sie suchen und sie entfernen. Eine einfache Möglichkeit, das zu tun ist, um die strip_tags Funktion zu nutzen und präsentieren nur die HTML-Tags ermöglichen Sie es.

Als nächstes nehmen Sie, was Sie haben und geben sie dachte htmlentities oder htmlspecialchars zu ändern, was es zu ASCII-Zeichen. Diese Mitteilung basiert auf Kontext und was Sie wollen raus.

Ich würde auch, empfehlen Magic Quotes ausschalten. Es ist wurde von PHP 6 entfernt und ist eine schlechte Praxis betrachtet, es zu benutzen. Details unter http://us3.php.net/magic_quotes

Für weitere Informationen Besuche http://ha.ckers.org/xss.html

Dies ist keine vollständige Antwort, aber hoffentlich genug, um Ihnen den Einstieg.

  

rikh Schreibt:

     
    

Ich tue mein Bestes, um immer htmlentities () aufrufe, für alles, was ich bin outputing dass von Benutzereingaben abgeleitet wird.

  

Siehe Joel Essay über machen Code falsch Hilfe suchen mit diesem

Ich verlasse mich auf PHPTAL dafür.

Im Gegensatz zu Smarty und einfache PHP, entkommen sie alle standardmäßig ausgegeben. Dies ist ein großer Gewinn für die Sicherheit, weil Ihre Website nicht vurnelable werden, wenn Sie htmlspecialchars() vergessen oder irgendwo |escape.

XSS ist HTML-spezifische Angriff, so HTML-Ausgabe ist der richtige Ort, um es zu verhindern. Sie sollten nicht Vorfilterung Daten in der Datenbank versuchen, da Sie zur Ausgabe von Daten auf ein anderes Medium benötigen könnten, die HTML nicht akzeptieren, sondern hat seine eigenen Risiken.

Template-Bibliothek. Oder zumindest das ist, was Template-Bibliotheken tun sollen. Um zu verhindern, XSS alle Ausgabe sollte verschlüsselt werden. Dies ist nicht die Aufgabe der Hauptanwendung / Steuerlogik, sollte es allein durch die Ausgabeverfahren behandelt werden.

Wenn Sie htmlentities bestreuen () thorughout Code, das gesamte Design ist falsch. Und wie Sie vorschlagen, können Sie eine oder zwei Stellen verpassen. Deshalb ist die einzige Lösung ist, strenge HTML-Codierung . -> wenn Ausgabe Vars erhält in einen HTML / XML-Stream geschrieben

Leider sind die meisten PHP-Template-Bibliotheken nur ihre eigene Vorlage Syntax hinzufügen, aber nicht selbst mit Ausgabecodierung betreffen, oder Lokalisierung, oder HTML-Validierung, oder irgendetwas von Bedeutung. Vielleicht jemand anderes weiß, für PHP eine richtige Template-Bibliothek?

Escaping alle Eingaben Benutzer ist für die meisten Websites genug. Vergewissern Sie sich außerdem, dass Session-IDs am Ende nicht in der URL, so dass sie nicht von dem Referer Link zu einer anderen Website gestohlen werden können. Außerdem, wenn Sie erlauben den Benutzern Links einreichen, stellen Sie sicher, dass keine javascript: Protokoll Links erlaubt; diese würden so schnell ein Skript auszuführen, wenn der Benutzer auf den Link klickt.

Wenn Sie über XSS-Attacken betroffen sind, kodiert die Ausgabe Strings HTML ist die Lösung. Wenn Sie sich erinnern jede einzelnen Ausgabezeichen in HTML-Format zu kodieren, gibt es keine Möglichkeit, einen erfolgreichen XSS-Angriff auszuführen.

Lesen Sie mehr: Sanitizing Benutzerdaten: Wie und wo es tun

Ich persönlich würde magic_quotes deaktivieren. In PHP5 + ist standardmäßig aktiviert und es ist besser, Code deaktiviert, als ob sie nicht da ist überhaupt, da es nicht alles entkommen, und es wird von PHP6 entfernt werden.

Als nächstes werden je nachdem, welche Art von Benutzerdaten, die Sie diktieren, sind Filterung, was als nächstes zu tun, zum Beispiel wenn es Text nur z.B. ein Name, es dann strip_tags(trim(stripslashes())); oder für Bereiche reguläre Ausdrücke überprüfen verwenden.

Wenn Sie einen bestimmten Wertebereich erwarten, einen Array der gültigen Werte schaffen und nur die Werte durch (in_array($userData, array(...))) ermöglichen.

Wenn Sie die Überprüfung Zahlen verwenden is_numeric ganze Zahlen oder auf einen bestimmten Typ gegossen zu erzwingen, dass die Menschen sollten verhindern versuchen Saiten anstatt zu senden.

Wenn Sie PHP5.2 + dann erwägen, unter Filter rel="nofollow () und die Nutzung von, dass Erweiterung, die verschiedenen Datentypen, einschließlich E-Mail-Adressen filtern. Die Dokumentation ist nicht besonders gut, aber es wird besser.

Wenn Sie HTML zu behandeln haben, dann sollten Sie so etwas wie betrachten PHP Eingangsfilter oder HTML Purifier . HTML Purifier wird auch HTML für die Konformität validieren. Ich bin nicht sicher, ob Eingangsfilter noch entwickelt werden. Beide können Sie einen Satz von Tags definieren, die verwendet werden können und welche Attribute sind erlaubt.

Was auch immer Sie sich entscheiden, immer daran denken, nie nie etwas vertrauen kommen in Ihre PHP-Skript von einem Benutzer (einschließlich sich selbst!).

All diese Antworten sind groß, aber im Grunde wird die Lösung XSS sein HTML-Dokumente zu stoppen Erzeugung von String-Manipulation.

Filtering Eingang ist immer eine gute Idee, für jede Anwendung.

Escaping Ausgabe htmlentities () verwendet und Freunde sollten so lange arbeiten, wie es richtig verwendet wird, aber dies ist die HTML-Äquivalent eine SQL-Abfrage durch Verketten von Strings mit mysql_real_escape_string ($ var) zu schaffen - es sollte funktionieren, aber weniger Dinge können bestätigen Sie Ihre Arbeit, so zu sprechen, im Vergleich zu einem Ansatz wie parametrisierte Abfragen verwendet wird.

Die langfristige Lösung sollte für Anwendungen sein, die Seite intern zu konstruieren, vielleicht eine Standardschnittstelle wie der DOM verwenden und dann eine Bibliothek zu verwenden (wie Libxml) die Serialisierung zu XHTML / HTML / etc zu behandeln. Natürlich sind wir einen von langen Wegen entfernt, dass sein beliebt und schnell genug, aber in der Zwischenzeit haben wir unsere HTML-Dokumente über String-Operationen zu bauen, und das ist von Natur aus riskant.

Ich finde, dass diese Funktion hilft viel von möglichen XSS-Angriffe Streifen aus: http://www.codebelay.com/killxss.phps

„Magic Quotes“ ist ein palliatives Heilmittel für einige der schlimmsten XSS Mängel, die durch die Flucht alles auf Eingabe arbeitet, etwas, das von Design falsch ist. Der einzige Fall, in dem man sich wünschen würde, es zu benutzen ist, wenn Sie unbedingt eine bestehende PHP-Anwendung verwenden müssen, bekannt im Hinblick auf XSS nachlässig geschrieben werden. (In diesem Fall sind Sie in ernsthaften Schwierigkeiten auch mit „Magic Quotes“). Wenn Sie Ihre eigene Anwendung entwickeln, sollten Sie „Magic Quotes“ deaktivieren und stattdessen XSS-sichere Praktiken folgen.

XSS, eine Cross-Site-Scripting-Schwachstelle, tritt auf, wenn eine Anwendung Strings aus anderen Quellen enthält (Benutzereingabe, geholt von anderen Webseiten, etc.) in seiner [X] HTML, CSS, ECMAScript oder anderen Browser-geparste Ausgabe ohne richtige Flucht, in der Hoffnung, dass Sonderzeichen wie weniger als (in [X] HTML), werden einfache oder doppelte Anführungszeichen (ECMAscript) nie erscheinen. Die richtige Lösung ist es immer Strings zu entkommen nach den Regeln der Ausgabesprache. Mit Einheiten in [X] HTML, Schrägstriche in ECMAscript etc

Da kann es schwierig sein, zu verfolgen, was nicht vertrauenswürdig ist und entkam werden, ist es eine gute Idee, immer alles zu entkommen, die eine „Textzeichenfolge“ ist im Gegensatz zu „Text mit Markup“ in einer Sprache wie HTML. Einige Programmierumgebungen erleichtern durch mehrere inkompatible String-Typen Einführung: „string“ (normaler Text), „HTML-String“ (HTML-Markup) und so weiter. Auf diese Weise eine direkte implizite Konvertierung von „string“ auf „HTML-String“ unmöglich wäre, und die einzige Möglichkeit, ein Zeichenfolge HTML-Markup werden könnte, ist, indem es durch eine Flucht Funktion übergeben.

„Register Globals“, obwohl es zu deaktivieren ist auf jeden Fall eine gute Idee, beschäftigt sich mit einem Problem ganz anders XSS.

Machen Sie Session-Cookies (oder alle Cookies) Sie verwenden Httponly. Die meisten Browser den Cookie-Wert von JavaScript in diesem Fall verstecken. Benutzer könnten immer noch manuell kopieren Cookies, aber das hilft direkten Skriptzugriff zu verhindern. Stackoverflow hatte dieses Problem durning Beta.

Dies ist keine Lösung, nur ein weiterer Stein in der Wand

  • Sie nicht vertrauen Benutzereingabe
  • Escape alle Freitextausgabe
  • Sie magic_quotes nicht verwenden; sehen, ob es eine DBMS-specfic Variante, oder verwenden Sie PDO
  • Betrachten Sie HTTP-Cookies nur mit wenn möglich, jede böswillige Skript in der Lage zu vermeiden, dass eine Sitzung kapern

Sie sollten mindestens validieren alle Daten in die Datenbank gehen. Und versucht, alle Daten zu validieren zu der Datenbank zu verlassen.

mysql_real_escape_string ist gut SQL-Injection zu verhindern, aber XSS ist schwieriger. Sie sollten preg_match, stip_tags oder htmlentities wo möglich!

Die beste aktuelle Methode für XSS in einer PHP-Anwendung zu verhindern ist HTML Purifier (http://htmlpurifier.org/). Ein kleiner Nachteil ist, dass es eine ziemlich große Bibliothek ist und werden am besten mit einem OP-Code-Cache wie APC verwendet. Sie würden dies an jedem Ort verwenden, bei denen nicht vertrauenswürdige Inhalte auf dem Bildschirm ausgegeben wird. Es ist viel gründlicher, dass htmlentities, htmlspecialchars, filter_input, filter_var, strip_tags, etc.

Verwenden Sie eine vorhandene Benutzer-Eingabe sanitization Bibliothek zu reinigen alle Benutzereingabe. Es sei denn, Sie setzen eine Los Mühe hinein, deren Umsetzung selbst wird nie so gut funktionieren.

Ich finde, der beste Weg, eine Klasse ist, die Sie Ihren Code binden kann, so dass Sie nie Sorgen zu machen, um Ihre Daten manuell zu entkommen.

Es ist schwierig, eine gründliche SQL-Injection / xss Injektion Prävention auf einer Website zu implementieren, die keinen Fehlalarm auslösen. In einem CMS der Benutzer Ende Vielleicht mag <script> oder <object> verwenden, um Elemente von einer anderen Seite verbindet.

Ich empfehle alle Benutzer mit installieren FireFox mit NoScript; -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top