Schadhaften Code von Rich-Text-Edit verhindern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Hallo,

nach vielen Jahren in dem ich Python hauptsächlich im wissenschaftlichen Bereich eingesetzt habe, will ich mich nun auch mit mit der Erstellung von Webapplikationen unter Python auseinandersetzen. Ich habe mir dazu Django als Framework auserkoren. Der Einstieg war nicht leicht, aber mittlerweile bin ich mit meinen Ergebnissen recht zufrieden und bin beeindruckt was man in kurzer Zeit alles so erstellen kann.

Ich komme nun jedoch an einer Stelle nicht weiter. Ich möchte auf der Client-Seite Rich-Text-Edits wie bspw. TinyMCE verwenden, um dem Benutzer auf einfache Art und Weise zu erlauben, formatierten Text zu erstellen, der dann später auf der Seite angezeigt werden soll. Die Ausgabe dieser Editoren erfolgt meist in HTML. Wie kann ich nun auf der Server-Seite verhindern, dass Schad-Code in dieses HTML einschmuggelt (z.B. mit Javascript-Elementen) wurde? Da gibt es doch mit Sicherheit schon etwas fertiges... Ich konnte leider nichts passendes finden.

MFG HerrHagen
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Parse einfach das HTML als Stream und entferne alle Tags die du nicht erlaubt hast. Sollte mit lxml in ein paar Zeilen gemacht sein.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Schön und gut. Das würde sicherlich funktionieren. Aber: Es gibt ja bspw. mehrere Arten wie man Javascript in HTML einbinden könnte (<script>, <link>). Wenn man noch browserspezifische Lösungen dazu nimmt, gibt sicherlich noch einige mehr, auf die man ohne umfangreiches Hintergrundwissen nie gekommen wäre. Sicherlich könnte man mit Whitelisten arbeiten und nur bestimmte Tags erlauben. Allerdings sehe ich die Gefahr, dass es doch wieder irgendwelche Tricks gibt (für bestimmte Browser, außerhalb jeder Norm) da etwas einzuschleusen, auf die ich als Einsteiger in diesem Bereich nie gekommen wäre.

Deswegen noch einmal die Frage: Gibt es da nicht schon was Schlüsselfertiges, wo jemand mit viel Geduld und Hintergrundwissen alle Eventualitäten bedacht hat?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Genshi hat da etwas eingebautes: http://genshi.edgewall.org/wiki/Documen ... -sanitizer

Hier noch ein Spickzettel zum Testen: http://ha.ckers.org/xss.html
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Wenn das ein Backend ist, dann würde ich das garnicht prüfen, denn vllt. ist der "Schadcode" (oder auch normaler js Code) ja gewollt.
the more they change the more they stay the same
lunar

@Dav1d: HTML-Eingaben nicht vertrauenswürdiger Clients müssen immer geprüft werden, ohne jede Ausnahme.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich gehe davon aus, dass das ein Backend für einen "geprüften" user bzw. admin ist und der user will vllt. dass bestimmter JS-Code ausgeführt wird
the more they change the more they stay the same
Benutzeravatar
snafu
User
Beiträge: 6831
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Dav1d: Lies vielleicht doch nochmal die Fragestellung:
Ich möchte auf der Client-Seite Rich-Text-Edits wie bspw. TinyMCE verwenden, um dem Benutzer auf einfache Art und Weise zu erlauben, formatierten Text zu erstellen, der dann später auf der Seite angezeigt werden soll. Die Ausgabe dieser Editoren erfolgt meist in HTML. Wie kann ich nun auf der Server-Seite verhindern, dass Schad-Code in dieses HTML einschmuggelt (z.B. mit Javascript-Elementen) wurde?
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Danke an derdon und lunar für die schnelle Antwort! Ich galub ich werds erstmal mit lxml versuchen. Genshi ist mir irgendwie etwas mysteriös...
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

snafu hat geschrieben:@Dav1d: Lies vielleicht doch nochmal die Fragestellung:
Ich möchte auf der Client-Seite Rich-Text-Edits wie bspw. TinyMCE verwenden, um dem Benutzer auf einfache Art und Weise zu erlauben, formatierten Text zu erstellen, der dann später auf der Seite angezeigt werden soll. Die Ausgabe dieser Editoren erfolgt meist in HTML. Wie kann ich nun auf der Server-Seite verhindern, dass Schad-Code in dieses HTML einschmuggelt (z.B. mit Javascript-Elementen) wurde?
Ich kann da nirgends erkennen ob der Benutzer ein admin o.ä. ist oder ein "surfer"
the more they change the more they stay the same
lunar

@Dav1d: Mein Gott, was hat das denn damit zu tun, welche Privilegien ein Nutzer besitzt?! ist es tatsächlich so schwer zu begreifen, dass Deine Antwort, gar nicht zu prüfen, einfach überhaupt nicht zur Frage, wie man das Einschleusen von Schadcode verhindern kann, passt? Im Übrigen ist der OP ganz offensichtlich zufrieden mit den Antworten, wozu also jetzt noch die Metadiskussion über die Fragestellung?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Is ja gut :evil:

Ich wollte nur erwähnen, dass es mich nerven würde (und andere bestimmt auch), wenn ich admin bin und keinen z.B. JS-Code einbetten darf.
the more they change the more they stay the same
lunar

@Dav1d: Als Admin aber würde es Dich bestimmt noch wesentlich mehr nerven, wenn jeder beliebige Benutzer einfach so JS-Code einbetten könnte ;)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ja, klar, man kann nicht jedem Nutzer erlauben JS einzubauen (z.B. in nem Kommentar) aber als Admin würde es mich verdammt nerven, wenn ich keinen JS-Code einbauen darf und erst den Quelltext ändern muss.
the more they change the more they stay the same
Benutzeravatar
snafu
User
Beiträge: 6831
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

"Fallentscheidung nach Nutzerrechten" klingt allerdings etwas anders als "bei einem Backend würde ich gar nicht prüfen". ;)

Ich wundere mich übrigens ebenfalls, wieso du so auf dem Thema herumreitest. Lunar sprach von "nicht vertrauenswürdigen Clients".
Antworten