8 Stimmen

JavaScript aus HTML herausfiltern

Ich habe einen Rich-Text-Editor, der HTML an den Server weitergibt. Dieses HTML wird dann für andere Benutzer angezeigt. Ich möchte sicherstellen, dass kein JavaScript in diesem HTML-Code enthalten ist. Gibt es eine Möglichkeit, dies zu tun?

Außerdem verwende ich ASP.NET, falls das hilft.

11voto

Noldorin Punkte 138548

Der einzige Weg, um sicherstellen dass ein HTML-Markup kein JavaScript enthält, besteht darin, alle unsicheren HTML-Tags und -Attribute herauszufiltern, um zu verhindern, dass Cross-Site-Scripting (XSS).

Im Allgemeinen gibt es jedoch keine zuverlässige Methode, um ausdrückliches Entfernen alle unsicheren Elemente und Attribute nach ihren Namen zu benennen, da bestimmte Browser möglicherweise Elemente interpretieren, die Ihnen zum Zeitpunkt des Entwurfs gar nicht bekannt waren, und so eine Sicherheitslücke für böswillige Benutzer öffnen. Aus diesem Grund ist es viel besser, wenn Sie eine Whitelisting Ansatz als ein Schwarze Liste ein. Das heißt, dass Sie nur HTML-Tags zulassen, die Sie sicher sicher sind, und alle anderen standardmäßig entfernt werden. Tatsächlich kann nur ein einziger versehentlich zugelassener Tag Ihre Website für XSS anfällig machen.


Whitelisting (guter Ansatz)

Siehe diesen Artikel auf HTML-Sanitisierung die einige konkrete Beispiele dafür enthält, warum Sie eher eine Whitelist als eine Blacklist erstellen sollten. Zitat von dieser Seite:

Hier ist eine unvollständige Liste potenziell gefährlicher HTML-Tags und -Attribute:

  • script die ein bösartiges Skript enthalten können
  • applet , embed y object die automatisch bösartigen Code herunterladen und ausführen können
  • meta die bösartige Weiterleitungen enthalten können
  • onload , onunload und alle anderen on* Attribute, die bösartige Skripte enthalten können
  • style , link und die style Attribut, das bösartige Skripte enthalten kann

Ici ist eine weitere hilfreiche Seite, die eine Reihe von HTML-Tags und -Attributen sowie CSS-Attributen vorschlägt, die in der Regel gefahrlos zugelassen werden können, sowie empfohlene Verfahren.

Schwarze Listen (generell schlechter Ansatz)

Obwohl viele Websites in der Vergangenheit (und auch heute noch) den Ansatz der schwarzen Listen verwenden, besteht fast nie ein echter Bedarf dafür. (Die Sicherheitsrisiken wiegen immer schwerer als die potenziellen Einschränkungen, die das Whitelisting bei den Formatierungsmöglichkeiten, die dem Benutzer gewährt werden, mit sich bringt). Sie müssen sich der Schwächen dieser Methode bewusst sein.

Zum Beispiel, diese Seite enthält eine Liste mit angeblich "allen" HTML-Tags, die Sie entfernen möchten. Wenn Sie die Liste nur kurz betrachten, werden Sie feststellen, dass sie nur eine sehr begrenzte Anzahl von Elementnamen enthält; ein Browser könnte leicht ein proprietäres Tag einfügen, das unwissentlich die Ausführung von Skripten auf Ihrer Seite ermöglicht, was im Grunde das Hauptproblem beim Blacklisting ist.


Schließlich würde ich Ihnen dringend empfehlen, ein HTML-DOM-Bibliothek (wie zum Beispiel das bekannte HTML-Beweglichkeitspaket ) für .NET zu verwenden, im Gegensatz zu RegEx, um die Bereinigung/Whitelisting durchzuführen, da dies wesentlich zuverlässiger ist. (Es ist durchaus möglich, ziemlich verrücktes, verschleiertes HTML zu erstellen, das Regexe täuschen kann! Ein ordentlicher HTML-Reader/Writer macht die Kodierung des Systems auf jeden Fall viel einfacher).

Das sollte Ihnen hoffentlich einen guten Überblick darüber geben, was Sie entwerfen müssen, um XSS vollständig (oder zumindest maximal) zu verhindern, und wie wichtig es ist, dass die HTML-Sanitisierung unter Berücksichtigung des unbekannten Faktors durchgeführt wird.

4voto

sleske Punkte 77202

Wie Lee Theobald betont hat, ist das ein sehr gefährlicher Plan. Man kann per Definition niemals "sicheres" HTML durch Filterung/Blacklisting erzeugen, da der Benutzer möglicherweise Dinge in das HTML einfügt, an die Sie nicht gedacht haben (oder die in Ihrer Browserversion gar nicht existieren, in anderen aber schon).

Der einzige sichere Weg ist ein Whitelisting-Ansatz, d. h. alles außer reinem Text und bestimmten HTML-Konstrukten wird entfernt. Dies ist übrigens das, was stackoverflow.com tut :-).

3voto

codedvillain Punkte 71

Hier ist, wie ich es mit einem White-Listing-Ansatz mache (Javascript und Python-Code)

https://github.com/dcollien/FilterHTML

Ich definiere eine Spezifikation für eine Teilmenge von zulässigem HTML, und das ist nur das, was durch diesen Filter kommen soll. Es gibt einige Optionen, um auch URL-Attribute zu reinigen, indem nur bestimmte Schemata zugelassen werden (wie http:, ftp: usw.) und solche, die XSS/Javascript-Probleme verursachen würden (wie javascript: oder sogar data:)

edit: Dies wird Ihnen nicht in allen Situationen 100%ige Sicherheit bieten, aber intelligent eingesetzt und in Verbindung mit einigen anderen Tricks (wie z.B. der Überprüfung, ob die URLs auf der gleichen Domain sind und den richtigen Content-Type haben, usw.) könnte es das sein, was Sie brauchen

2voto

trydyingtolive Punkte 327

Wenn Sie möchten, dass die Html-Datei geändert wird, damit die Benutzer den HTML-Code selbst sehen können. Ersetzen Sie alle Zeichenfolgen '<', '>', '&' und ';'. Zum Beispiel wird '<' zu '<'.

Wenn Sie möchten, dass das HTML funktioniert, ist es am einfachsten, das gesamte HTML und Javascript zu entfernen und dann nur das HTML zu ersetzen. Leider gibt es kaum eine sichere Möglichkeit, Javascript zu entfernen und nur HTML zuzulassen.

Sie können zum Beispiel Bilder zulassen. Sie wissen aber vielleicht nicht, dass Sie das können

<img src='evilscript.js'>

und es kann das Skript ausführen. Es wird sehr schnell sehr unsicher$. Aus diesem Grund verwenden die meisten Websites wie Wikipedia und diese Website eine spezielle Markdown-Sprache. Das macht es viel einfacher, Formatierungen zuzulassen, aber kein bösartiges Javascript.

-1voto

Darryl Hein Punkte 138311

Vielleicht möchten Sie prüfen, wie einige browserbasierte WYSIWYG-Editoren wie TinyMCE tun. Sie entfernen in der Regel JS und scheinen dabei eine gute Arbeit zu leisten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X