Ich habe derzeit eine einfache <div contenteditable="true">
funktioniert, aber, hier ist mein Problem.
Derzeit kann der Benutzer ein persistentes XSS erstellen, indem er ein <script>
in das div einfügt, was ich definitiv nicht möchte.
Allerdings sind meine aktuellen Ideen, dies zu beheben:
Was meinst du?
Sie müssen daran denken, dass, um XSS zu verhindern, Sie es auf der Serverseite tun müssen. Wenn Ihr Rich-Text-Editor (ex YUI oder tinyMCE) über Javascript verfügt, um die Eingabe eines Skript-Tags zu verhindern, stört mich das nicht, Ihre http-Post-Anfragen zu prüfen, die verwendeten Variablennamen zu prüfen und dann firefox zu verwenden Poster, um die Saite, die ich mag, an Ihren Server zu senden, um die Validierung aller Client-Seiten zu umgehen. Wenn Sie die Benutzereingabe SERVER SIDE nicht bestätigen, machen Sie fast nichts produktives, um vor XSS zu schützen.
Jeder clientseitige xss-Schutz würde damit zu tun haben, wie Sie Benutzereingaben rendern. nicht wie du es bekommst. Also zum Beispiel, wenn Sie alle Eingaben so codiert haben, dass sie nicht als HTML dargestellt werden. Dies geht jedoch von dem aus, was Sie erreichen möchten (nur Anker- und IMG-Tags). Denken Sie nur daran, je mehr Sie erlauben, die mehr möglichen Schwachstellen darzustellen, die Sie verfügbar machen.
Das heißt, der Großteil Ihres Schutzes sollte von der Serverseite kommen, und es gibt viele XSS-Filter da draußen, je nachdem, mit was Sie schreiben (ex, asp.net oder tomcat / derby / jboss) kann hineinsehen.
Ich denke, du bist auf dem richtigen Weg, indem du NUR a- und img-Tags zulässt. Die eine Sache, die Sie beachten müssen, ist, dass Sie JavaScript-Befehle in die src-Attribute eines Tags einfügen können. Achten Sie also darauf, die href-Attribute zu validieren. Aber die Grundidee "erlaube nichts und dann ändere die Filter nur bestimmte Dinge zu erlauben" (AKA-Whitelist-Filterung) ist besser als "erlaube alles und dann filtere heraus, was ich nicht will" (AKA-Blacklist-Filterung).
In den Kommentaren unten Brian Nickel sagte das auch, was den Punkt verdeutlicht:
Alles außer den Elementen und , die Sie beibehalten möchten. ich Ich wüsste, dass du es in deiner Antwort erwähnt hast, aber das muss man wiederholen ist so gruselig.
<img onerror="stealMoney()">
Die andere Sache, die Sie tun möchten, ist ein XSSFilterRequest-Objekt (oder etwas in diesen Zeilen) zu definieren und in einem Filter Ihre Anforderungen zu überschreiben, so dass alle Aufrufe Ihrer "getUrlParameter" - und "getRequestParameter" -Objekte ausgeführt werden Die Anfragewerte über Ihren XSS-Filter. Dies bietet eine saubere Möglichkeit, alles zu filtern, ohne vorhandenen Code neu zu schreiben.
EDIT: Ein Python-Beispiel für XSS-Filterung:
Was ist mit der Verwendung von Google caja (ein Source-to-Source-Übersetzer für die Sicherung von Javascript- basierter Web-Content)
Sofern Sie keine xss-Validierung auf der Serverseite haben, können Sie html_sanitize
sowohl auf Daten anwenden, die vom Benutzer gesendet werden, als auch auf Daten, die von dem Server empfangen werden, der angezeigt werden soll. Im schlimmsten Fall erhalten Sie XSSed-Inhalte in der Datenbank, die dem Benutzer niemals angezeigt werden.
Tags und Links javascript html jquery xss