Frage

Ich bin nicht besorgt über andere Arten von Angriffen.Möchte nur wissen, ob HTML-Codierung verhindern kann alle Arten von XSS-Angriffen.

Gibt es eine Weg, um einen XSS-Angriff, selbst wenn HTML-Codierung verwendet wird?

War es hilfreich?

Lösung

Nein.

Lässt man einmal beiseite, das Thema einige Tags zu erlauben (nicht wirklich der Punkt der Frage), wird Htmlencode einfach nicht alle XSS-Angriffe ab.

Betrachten wir zum Beispiel vom Server generierte clientseitiges JavaScript - der Server dynamisch Htmlencoded Werte ausgibt, direkt in die clientseitige JavaScript, Htmlencode wird Stop nicht injizierten Skript aus Ausführen

.

Als nächstes betrachten Sie den folgenden Pseudo-Code:

<input value=<%= HtmlEncode(somevar) %> id=textbox>

Nun, falls es nicht sofort offensichtlich, wenn somevar (durch den Benutzer gesendet, natürlich) wird beispielsweise auf

a onclick=alert(document.cookie)

die resultierende Ausgabe ist

<input value=a onclick=alert(document.cookie) id=textbox>

das wäre eindeutig arbeiten. Offensichtlich kann dieses (fast) jedes anderes Skript sein ... und Htmlencode würde nicht viel helfen.

Es gibt ein paar zusätzlichen Vektoren in Betracht gezogen werden ... einschließlich dem dritten Geschmack von XSS, genannt DOM-basierter XSS (wobei das schädlichen Skript dynamisch auf dem Client generiert wird, beispielsweise basierend auf # Werten).

Vergessen Sie auch nicht über UTF-7-Attacken - wo der Angriff sieht aus wie

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-

Es gibt nicht viel zu kodieren dort ...

Die Lösung, natürlich (zusätzlich zu dem richtigen und restriktiven weiß-Liste Eingabevalidierung), durchzuführen kontextsensitive Codierung: HtmlEncoding ist groß, wenn Sie Ausgabekontext HTML IS sind, oder vielleicht brauchen Sie JavaScriptEncoding oder VBScriptEncoding oder AttributeValueEncoding oder ... etc.

Wenn Sie MS ASP.NET verwenden, können Sie ihre Anti-XSS-Bibliothek verwenden, die alle notwendigen Kontext-Codierverfahren zur Verfügung stellt.

Beachten Sie, dass alle Codierung nicht auf Benutzereingaben eingeschränkt werden sollte, sondern auch Werte aus der Datenbank, Textdateien gespeichert, etc.

Oh, und vergessen Sie nicht explizit die charset gesetzt, sowohl im HTTP-Header und den META-Tag, sonst werden Sie noch UTF-7 Schwachstellen haben ...

Einige weitere Informationen und eine ziemlich endgültige Liste (ständig aktualisiert) Besuche RSnake den Cheat Sheet: http: //ha.ckers.org/xss.html

Andere Tipps

Wenn Sie systematisch alle Benutzereingaben verschlüsseln, bevor die Anzeige dann ja, Sie sind sicher Sie sind immer noch nicht zu 100% sicher.
(Siehe @ Avid Beitrag für mehr Details)

Darüber hinaus entstehen Probleme, wenn Sie lassen müssen einig -Tags gehen unverschlüsselte, so dass Sie Benutzer erlauben, Bilder oder fett gedruckten Text oder eine Funktion zu schreiben, die Eingabe des Benutzers erfordert als verarbeitendes (oder umgewandelt) un -encoded Markup.

Sie müssen eine Entscheidung treffen System einzurichten, um zu entscheiden, welche Tags erlaubt sind und welche nicht, und es ist immer möglich, dass jemand einen Weg finden werden zu lassen, durch einen nicht erlaubten Tag passieren.

Es hilft, wenn Sie Joel Rat von machen Falscher Code Falscher Schauen oder wenn < a href = "http://blog.moertel.com/articles/2006/10/18/a-type-based-solution-to-the-strings-problem" rel = "noreferrer"> Ihre Sprache hilft Ihnen von Warnung / nicht kompiliert, wenn Sie nicht verarbeiteten Benutzerdaten (statisch-Typisierung).

ausgeben

Wenn Sie kodieren alles, es wird. (Abhängig von Ihrer Plattform und der Umsetzung von Htmlencode) Aber jede nützliche Web-Anwendung ist so komplex, dass es einfach zu vergessen, jeden Teil davon zu überprüfen. Oder vielleicht eine 3rd-Party-Komponente ist nicht sicher. Oder vielleicht einige Code-Pfad, die Sie allerdings hat Codierung tat es nicht so vergessen Sie es woanders.

Sie wollen also vielleicht Dinge auf der Eingangsseite zu überprüfen. Und möchten Sie vielleicht Sachen überprüfen Sie aus der Datenbank gelesen werden.

Wie von allen anderen erwähnt, sind Sie sicher, solange Sie kodieren alle Benutzereingabe, bevor sie angezeigt werden. Dies umfasst alle Anforderungsparameter und Daten aus der Datenbank abgerufen, die durch eine Benutzereingabe geändert werden kann.

Wie von Pat erwähnt Registrieren möchten manchmal einige Tags angezeigt werden, nur nicht alle Tags. Ein üblicher Weg, dies zu tun, ist eine Auszeichnungssprache zu verwenden, wie Textile , Markdown oder BBCode . Aber auch Markup-Sprachen anfällig für XSS sein können, nur bewusst sein.

# Markup example
[foo](javascript:alert\('bar'\);)

Wenn Sie sich entscheiden, „sicher“ Tags lassen durch ich einige vorhandene Bibliothek zu finden, würde empfehlen, zu analysieren und desinfizieren Sie den Code vor der Ausgabe. Es gibt viele XSS Vektoren dort , dass Sie müssten erkennen, bevor Ihr Sanitizer recht ist Safe.

I metavida Rat zweit eine Drittanbieter-Bibliothek zu finden, um Ausgangsfilterung zu umgehen. HTML-Zeichen neutralisierende ist ein guter Ansatz, um XSS-Angriffe zu stoppen. Allerdings Sie den Code verwenden Metazeichen zu transformieren können, um Steuerhinterziehung Angriffe anfällig sein; zum Beispiel, wenn sie nicht richtig handhaben Unicode und Internationalisierung.

Ein klassischer einfacher Fehler Filter Homebrew Ausgang machen, ist nur zu fangen , aber verpassen Dinge wie“, die benutzergesteuerte Ausgabe in den Attributraum eines HTML-Tags brechen kann, wo Javascript kann auf das DOM angeschlossen werden .

Nein, nur kodiert gängige HTML-Token nicht vollständig Ihre Website von XSS-Angriffen schützen. Siehe zum Beispiel dieser XSS-Schwachstelle in google.com gefunden:

http://www.securiteam.com/securitynews/6Z00L0AEUE.html

Das Wichtigste über diese Art der Verwundbarkeit ist, dass der Angreifer in der Lage ist, seine XSS Nutzlast mit UTF-7, zu kodieren, und wenn Sie nicht einer anderen Zeichencodierung auf Ihrer Seite angegeben haben, der Browser des Benutzers könnte die UTF- interpretieren 7 Nutzlast und führen den Angriff Skript.

Eine andere Sache, die Sie überprüfen müssen, ist, wo Sie Ihre Eingabe herkommt. Sie können den Referrer-String (die meiste Zeit), um zu überprüfen, dass es von Ihrer eigenen Seite ist, aber in einer versteckten Zufallszahl oder etwas in der Form setzen und es dann überprüft (mit einer Sitzung Setvariable vielleicht) hilft auch, dass das Wissen Eingang wird von Ihrer eigenen Website kommt und nicht einig Phishing-Seite.

Ich möchte HTML vorschlagen Purifier ( http://htmlpurifier.org/ ) Es ist nicht nur die hTML-Filter, es ist im Grunde tokenizes und neu kompiliert. Es ist wirklich industrietauglichen.

Es hat den zusätzlichen Vorteil, dass Sie gültige HTML / XHTML-Ausgabe zu gewährleisten.

Auch n'thing Textil, es ist ein großartiges Werkzeug, und ich benutze es die ganze Zeit, aber ich würde es aber HTML Purifier laufen.

Ich glaube nicht, dass Sie verstehen, was ich re-Token gemeint. HTML Purifier nicht nur ‚Filter‘, es rekonstruiert tatsächlich die html. http://htmlpurifier.org/comparison.html

Ich glaube nicht. Html Encode konvertiert alle funktionalen Zeichen (Zeichen, die vom Browser als Code interpretiert werden könnte) in Entity-Referenzen, die nicht durch den Browser analysiert werden und somit kann nicht ausgeführt werden.

&lt;script/&gt;

Es gibt keine Möglichkeit, dass die oben kann durch den Browser ausgeführt werden.

** Es wäre denn, sie ist ein Fehler im Browser ofcourse. *

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