2009-01-24 10 views
9

Weiß jemand, ob ein DOM Node vom Typ Text garantiert nicht als HTML vom Browser interpretiert werden kann?Wird ein DOM-Textknoten garantiert nicht als HTML interpretiert?

Weitere Details folgen.

Hintergrund

Ich bin für einen Freund ein einfaches Web-Kommentar-System bauen, und ich habe über XSS-Angriffe gedacht. Ich denke nicht, dass das Filtern oder Entkommen von HTML-Tags eine sehr elegante Lösung ist - es ist zu einfach, eine Faltung zu entwickeln, die über den Filter hinausrutschen wird. Das grundlegende Problem ist, dass ich garantieren möchte, dass für bestimmte Teile des Inhalts (d. H. Den Inhalt, den zufällige nicht authentifizierte Web-Benutzer POST), der Browser nie versucht, den Inhalt zu interpretieren oder auszuführen.

Ein einfacher (Text) beginnen

Der erste Gedanke, den Sinn kam nur Content-Type: text/plain zu bedienen ist, aber dies hat zu einer ganzen Seite anzuwenden. Sie können einen Klartext IFRAME in der Mitte einer Seite einfügen, aber es ist hässlich, und es erstellt Fokusprobleme, wenn der Benutzer in den Rahmen klickt.

innertext/textcontent/JQuery

Es stellt sich heraus, dass einige Browser-spezifische (innerText in IE, textContent in FF, Safari, etc.) gibt es Attribute, die, wenn es gesetzt ist, eine schaffen erforderlich single Text Knoten.

JQuery versucht, den Unterschied in der Browser-spezifischen Attribute zu vermeiden, durch eine einzige Funktion text(val) Implementierung, die die Browser-spezifischen Attribute überspringt und geht direkt an document.createTextNode(text), die, wie Sie, einen Text Knoten schafft erraten kann.

W3 DOM TextNode s

Also ich denke, das ist in der Nähe, was ich will, es sieht good-- Text Knoten keine Kinder haben können, und es scheint, als wären sie nicht so interpretiert werden kann, HTML. Aber ich bin nicht 100% sicher von den offiziellen Dokumenten.

Der Teil von textContent ist besonders ermutigend, weil sie sagt, „auf Einstellung wird kein Parsing entweder durchgeführt, Die Eingabezeichenfolge wird als reiner Textinhalt verwendet. " Aber ist das grundlegend für alle Knoten oder nur Knoten, auf denen Sie textContent setzen? Dies scheint wahrscheinlich eine dumme Frage zu sein, aber es könnte wichtig sein, weil IE textContent nicht unterstützt (siehe oben).

Zurück um auf die erste Frage

Kann jemand bestätigen/reject, dass dies funktionieren wird? Das heißt, dass ein W3 DOM-konformer Browser niemals einen Text Knoten als HTML interpretiert, egal welchen Inhalt? Ich wäre sehr dankbar, wenn diese quälende kleine Unsicherheit gelöst wäre.

Vielen Dank für Ihre Zeit!

Antwort

5

Ja, dies ist bestätigt, in dem Maße, dass für was auch immer Browser es nicht war, dass der Browser einen schweren Defekt haben würde. Ein Textknoten, der alles außer Text darstellt, wäre ein Widerspruch. Durch die Verwendung von document.createTextNode ("some string"); und das Anhängen dieses Knotens ist die garantierte, die als Text gerendert wird.

0

Ich glaube nicht, oder HTML-Tags ist eine sehr elegante Lösung entweicht Filterung - es mit einer Faltung kommen zu leicht ist, die

die absolut unwahr ist, vorbei an dem Filter rutschen Filterung > bis & gt; und < bis & lt; wird jegliche HTML-Injektion vollständig stoppen.

+2

Ich bin stützen meine Paranoia auf: http://stackoverflow.com/questions/53728/will-html-encoding-prevent-all-kinds-of-xss-attacks http: // blog. stackoverflow.com/2008/06/safe-html-and-xss/ – elliot42

+2

@surprise_ falsch. Es gibt viele andere Injektionstechniken, von Encoding - Tricks, bis hin zu Attributinjektionen, JavaScript, CSS usw – Zach