2017-12-27 15 views
3

Ich habe das etwas damit verbundene Frage div contenteditable, XSS lesen, aber seine Antworten über die XSS saftey von contenteditable nicht viel markieren. Insbesondere im Hinblick auf versehentliche (im Vergleich zu absichtlichen Cross-Site-Scripting). Mir ist natürlich bewusst, dass ich Benutzereingaben serverseitig bereinigen sollte.Ist das zufriedene HTML5-Attribut XSS-sicher?

TL.DR.: Kann ich sicher sein, dass der Benutzer nicht Gefahr nicht stehen einige externe Skript einzuführen (das heißt über Daten aus der Zwischenablage eingefügt.) Über eine Seite Element contenteditable gesetzt werden? Stellt die Spezifikation sicher, dass jedes Markup, das in den Contenteditable eingefügt wird, bereinigt wird, bevor es in das DOM eingefügt wird?

Ich habe bemerkt, dass auf zwei wichtigen Browsern ich getestet, Chrom/Chrome und Firefox, dass er versehentlich ein aktiven Elemente in den contenteditable Tag unmöglich zu sein scheint einzufügen. Ein Beispiel für eine solche accedental Einfügung ich zum Beispiel sein gedacht hätte:

  • Benutzer kopiert eine Auswahl von DOM-Elemente aus einer Webseite und fügt sie in die contenteditable Element auf einer anderen Website.
  • Mitglieder gaben (auf Linux-Befehlszeile) echo "<b onclick='alert("XSS");'>click me</b>" | xclip -t text/html -selection "clipboard" und Pasten, die in die contenteditable.

Ein aktives Element würde alles wie:

  • HTML-Auszeichnungs eine <script>
  • HTML-Auszeichnungs enthält Elemente mit Inline-Handler wie onclick="alert(\"XSS\");"
  • HTML-Auszeichnungs enthält JavaScript hrefs enthalten, wie <a href="javascript:alert(\"XSS\")"> click me </a>

Jetzt ist meine Frage, zu sehen, dass contenteditable etwas sicher scheint, dass irgendein normaler XSS-Vektor eingefügt wird, wenn das beabsichtigt ist?

Ich habe einige specs/refs/whatever gelesen, wo es sich weder explizit erwähnt, dass contenteditable verhindern sollte jede aktive Element in das DOM der Seite eingefügt werden, weder, dass es erlaubt sein würde. Dies lässt mich in Zweifel, ob ich die contenteditable Funktion verwenden sollte, da ich kein externes Javascript riskieren möchte, das in contenteditable eingefügt wird. Beantworten Sie diese XSS-Sicherheit von contenteditable ist der Kern dieser Frage.

aktualisieren Im Gegensatz zu den contenteditable die eine ähnliche Funktion bietet Dokumente Attribut designMode scheint spezifisch zu sein (siehe https://www.w3.org/TR/2008/WD-html5-20080610/web-browsers.html#designModeScriptBlocked) über die Javascript (daher XSS verhindert) deaktiviert werden.

UPDATE 2 Die jüngste Referenz/spec auf MDN zitiert ist https://html.spec.whatwg.org/multipage/interaction.html#contenteditable , die über irgendwelche Garantien seltsam indifferent ist, dass contenteditable malicous JavaScript über Paste nicht einführen bietet.

+3

Solange Sie die Eingabe auf der Serverseite sanieren, sehe ich nicht, warum jemand ein JavaScript in eine 'contenteditable' einfügen ist sogar ein Problem. Jeder kann die Dev Tools öffnen und JavaScript auf der Seite ausführen, das für einen XSS-Angriff ausreichen könnte, wenn die Server-Seite nicht eingerichtet ist, um dies zu verhindern. –

+0

@DeepakKamat Ich stelle mir vor, dass (vorausgesetzt, der Benutzer ist angemeldet und hat bestimmte Privilegien, wie zum Beispiel Inhalte zu löschen), ich würde es problematisch finden, wenn das Einfügen eines bösartigen Skripts diese Privilegien erben würde. Was würden Sie sagen? Außerdem gehe ich davon aus, dass XSS Sicherheit auch die Sicherheit der Benutzerdaten (wie zB seiner Eingabedaten) eines bösartigen Skripts, wenn möglich über "contenteditable", dann xhr/send an böswillige Dritte weiterleiten kann. Sicher ist es nett, dass der Server kompromisslos ist, aber in meinem Verständnis auch XSS, das das Benutzerkonto/die Daten angreift, ist schlecht, daher meine Sorge – humanityANDpeace

+0

Irgendein Grund, warum Sie Spezifikationen von 9 und vor einem halben Jahr anstelle von gegenwärtigen specs lesen? – BoltClock

Antwort

0

Es gibt keinen Standard, der Browser einhalten müssen, so dass jeder Browser für den Umgang mit Benutzereingabe eine eigene Implementierung haben.Und wenn es einen Weg gibt, können Sie sicher sein, dass Benutzer herausfinden, wie es geht (ältere Browser sind normalerweise am anfälligsten). Es liegt an Ihnen, die Eingaben des Benutzers zu bereinigen, sei es durch Tippen, Einfügen usw. (Ich musste dies für ein Projekt tun, es gibt keine Möglichkeit, sich darauf zu verlassen, "einfach zu arbeiten").

Was designmode, der Teil Du verknüpfen:

Wenn ein Skript in einem Skript-Ausführungskontext ausgeführt werden soll, in dem Scripting deaktiviert ist, muss das Skript nichts tun und das Rück nichts (void als Rückgabewert).

So wird zum Beispiel die Aktivierung von designMode alle Event-Handler-Attribute, Event-Listener, Timeouts usw. deaktivieren, die von Skripten im Dokument festgelegt wurden.

Dies würde es designmode macht Sie „sicher“, aber denken Sie daran, Spezifikationen entwickelte sich im Laufe der Zeit, so ohne Umweg zurück und testet alle verschiedenen Browsern (oder zumindest die, die Ihre Benutzer) erscheinen lassen, können Sie Sei nie sicher.

+0

Ich habe das "Safe" getestet, über den 'document.designMode = "on" 'und es hat sich nicht wie erwartet verhalten. https://StackOverflow.com/q/47996078/1711186 – humanityANDpeace

+0

Gmail verwendet ein "contenteditable" in seiner html5-Benutzeroberfläche, so kann ich mir keine mögliche XSS oder HTMLInjection vorstellen https://davidyat.es/2016/02/16/contenteditable/Issue sind dem Browser komplett. Für mich ist es völlig logisch, dass jeder Browser, der so weit geht, dass er Contenttable implementiert, ihn so implementiert, dass durch das Einfügen von Inhalten kein Datenschutzrisiko entsteht. Die Antwort, dass es keinen Standard gibt, ist entweder schockierend oder falsch oder riskant :) – humanityANDpeace

+0

Ich würde sagen gruselig !! Aber glauben Sie mir, ich habe stundenlang durch Dokumentation gelesen, die w3 specs auf Formelementen, Eingabeereignissen u. Contenteditable liest, nur um zu schließen, dass es Implementierung spezifisch ist. http://www.w3.org/TR/#w3c_all Ich arbeitete an einem HTML-basierten Mail-System ähnlich wie GMail mit contentEditable und wir konnten nicht mit designMode arbeiten, da wir wollten, dass unser eigener JS noch im Inneren lief. contentEditable ist wirklich nicht anders als oder