Sicherheit bei WYSIWYG-Editor

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Sicherheit bei WYSIWYG-Editor

    Fühlt euch gegrüßt von mir! ;)

    Ich habe da mal eine etwas komische Frage. Ich würde gern in meiner Website einen WYSIWYG-Editor verwenden. Das ist ansich ja nicht so das Problem. Also habe ich mir mal den ckEditor geladen und eingebunden. Funktion echt super.

    Meine Frage und mein Problem ist nun folgendes: Wenn jemand JavaScript abschaltet, kann er problemlos <script>alert('test');</script> in die Textarea schreiben und das wird nach dem Speichern auch ausgeführt auf der Seite. Wenn ich die Ausgabe aber mit htmlspecialchars() behandele, bekommt der Benutzer den vollen Quellcode vorn Kopp gehauen.

    Wie genau kann ich diese Sicherheitslücke (XSS) beheben oder habe ich etwas übersehen? Oder ist das vielleicht noch niemandem aufgefallen?

    Danke erstmal!
    MrSecure
  • Guten Abend und danke für die Antwort!

    Wenn ich doch den ckEditor beispielsweise nutzen möchte, wie soll ich den dann sicher machen? Jeder kann JavaScript deaktivieren und dadurch nutzen was er will. Da muss es doch irgendwas geben. Wie funktioniert das denn hier in diesem Forum? Könnte ich hier problemlos wenn ich JavaScript deaktiviere ein Alert auswerfen?

    Ein WYSIWYG-Editor speichert mir ja reinen HTML-Code. Wenn jemand ein Wort fett markiert, habe ich in meiner Datenbank stehen: <strong>Test</strong>
    Das soll er auch problemlos wiedergeben. Nur halt kein JavaScript oder IFrame etc. was halt Schaden anrichten kann.

    MrSecure bedankt sich!
  • Es ist egal ob ckEditor oder reines Textfeld.

    Übergeben wir in beiden Fällen das gleiche, mit dem ckEditor hast du nur einfach eine HTML-Ansicht und kannst alles einfach bearbeiten.

    Wenn du zum Beispiel im Editor nen Text fett machst bekommst du am Ende sowas wie:

    Source Code

    1. <b>test</b>


    Im normalen Textfeld hast du natürlich nichts so komfortables uns müsstest das selber in HTML reinschreiben.

    Also übergeben wir immer das selbe egal ob Editor oder reines Textfeld.
    Der ckEditor ist eigentlich trotzdem ein ganz normales Textfeld nur eben durch JS "aufgepeppt".

    Um dich vor sowas zu schützen musst du wie Torben schon sagte htmlspecialchars() oder strip_tags() nutzen.

    MfG
    Exi
  • Also ich nutze den Tinymce (tinymce.com/) in dem habe ich Javascript blockiert,
    in dem du ihm sagst welche Elemente er nicht zulassen soll, diese werden dann erst garnicht in die DB eingetragen.

    Du bindest den Editor ein und schreibst oben im Headbereich zusätzlich z.B.

    Source Code

    1. invalid_elements : "<script>"


    oder <iframe> je nach dem was du alles nicht willst ;)
    Nur wer seinen eigenen Weg geht, kann von niemandem überholt werden.
  • Hallo,

    danke euch für die Antworten.

    Wenn ich das mit den invalideElements mache, bringt mich das doch auch kein Stück weiter. Sobald ich JavaScript mal deaktiviere, habe ich das reine Textfeld vor der Nase. Da kann ich dann problemlos eintippen was ich will, z.B. das Cookie auslesen und auf eine URL-weiterleiten, mit der ich die sensiblen Daten herausfischen kann.

    Ich sehe das als eine riesige Sicherheitslücke. Man muss doch irgendwie sicherstellen, dass er nur bestimmte Tags zulässt oder anstatt von HTML nur BB-Codes in die Datenbank schreibt, die ich dann wiederum mit Suchen/Ersetzen entsprechend darstellen kann.
  • Wo ist dein Problem?
    Wenn du JS deaktivierst hast du auch keinen WISIWYG-Editor?

    Du musst das zB mit PHP machen und bestimmte Elemente sperren wie <script> etc pp.
    Nix JS, die Lösung lautet PHP.

    Und da kannst du auch dein JS deaktivieren, neu installieren, verkaufen und sonst was - PHP checkt es!
  • Da muss ich ja Millionen Sachen prüfen.

    Oder hat mal jemand freundlicherweise einen Codeschnipsel? Eine Whitelist wäre am besten oder?

    Weil wenn ich <script> sperre, kann er auch genausogut <img src="javascript:... nutzen oder bei einem onerror etwas ausführen.

    Danke euch!
  • Hier wurden bereits zweimal die Funktionen htmlspecialchars() und strip_tags() angesprochen. Letztere ermöglicht es dir, bestimmte HTML-Tags per Whitelist zuzulassen.
    Ich würde dir allerdings am ehesten die Bibliothek HTML Purifier empfehlen. Diese wandelt nämlich den oftmals wirren Code des WYSIWYG-Editors in valides HTML um und filtert u. a. mithilfe einer Whitelist unerwünschte Tags heraus.
  • Ich glaube wir können alle nicht ganz nachvollziehen was du a.) vorhast und was b.) dein Problem ist ...

    Wenn es um WYSIWYG Editoren geht, nehme doch einen der BBCode nutzt bzw. nutze BBCode ... Sprich du speicherst die User Eingaben und jagst die bei der Ausgabe durch htmlspecialchars und einem BBCode Parser und zack hast du dein (vermutetes) Ziel erreicht ...

    Verständlich?
  • :D schwierige Geburt.

    So habe ich es ja momentan und möchte meinen Benutzern mehr Komfort anbieten.

    Also habe ich einen WYSIWYG-Editor eingebaut. Wenn ich nun etwas speichere, z.B. test, so steht in der Datenbank nun auch <strong>test</strong> drin. Wenn ich das wiedergebe mit htmlspecialchars(), so sieht der Benutzer NICHT test sondern <strong>test</strong>. Wofür soll hier htmlspecialchars() gut sein?
  • Es ist nicht verkehrt mit BBcode zu arbeiten so, dass du alles umwandlungsfähige umwandelst und alles andere vor dem Schreiben in die Datenbank löschst und beim auslesen einfach die Befehle wieder zurück in html umwandelst.

    Generell ist es ja so, dass man nicht x beliebige Formatierungsmöglichkeiten benötigt (also nicht alle HTML Befehle zulässt), sondern nur eine Hand voll.


    PHP selber bietet eine BBCode Integration an. Wenn diese nicht verfügbar sein sollte, was meist der Fall ist, dann kannst du einfach bei der Suchmaschine deiner Wahl nach einer gleichwertigen Klasse suchen.

    Das hab ich auf die Schnelle gefunden: christian-seiler.de/projekte/php/bbcode/index.html
  • Du kannst doch auch einfach eine Checkbox per Javascript ausgeben, die aktiviert werden muss,
    wenn kein Javascript aktiviert ist, erscheint keine Checkbox, also wird der Eintrag in die DB auch nicht ausgeführt,
    somit zwingst du den Nutzer Javascript zu aktivieren und kannst mit dem invalid Element die Elemente verbieten die du willst.
    Nur wer seinen eigenen Weg geht, kann von niemandem überholt werden.
  • mopsel wrote:

    Du kannst doch auch einfach eine Checkbox per Javascript ausgeben, die aktiviert werden muss,
    wenn kein Javascript aktiviert ist, erscheint keine Checkbox, also wird der Eintrag in die DB auch nicht ausgeführt

    Auch das ist keine ernstzunehmende Sicherheitsmaßnahme. Du kannst immerhin noch nicht einmal feststellen, ob der potentielle Angreifer brav das entsprechende Formular in seinem Browser ausgefüllt hat oder der Request anderweitig ausgelöst wurde.