5 Stimmen

Wie kann ich HTML textil und desinfizieren?

Jetzt bin ich in eine dumme Situation geraten. Ich möchte, dass die Benutzer Textile verwenden können, aber sie sollen nicht mit meinem gültigen HTML herumspielen können. Also muss ich das HTML irgendwie escapen.

  • html_escape(textilize("Foo")) würde Textile zerstören, während

  • textilize(html_escape("Foo")) funktionieren würde, aber verschiedene Textile-Funktionen wie Links (geschrieben als "Linkname":http://www.wheretogo.com/) zerbrechen würde, da die Anführungszeichen in " umgewandelt würden und somit von Textile nicht mehr erkannt werden würden.

  • sanitize macht es nicht besser.

Irgendwelche Vorschläge dazu? Ich würde es bevorzugen, für dieses Problem nicht Tidy zu verwenden. Vielen Dank im Voraus.

7voto

Marcel Jackwerth Punkte 51964

Für diejenigen, die auf das gleiche Problem stoßen: Wenn Sie das RedCloth gem verwenden, können Sie einfach Ihre eigene Methode definieren (in einem Ihrer Helper).

def safe\_textilize( s )
  if s && s.respond\_to?(:to\_s)
    doc = RedCloth.new( s.to\_s )
    doc.filter\_html = true
    doc.to\_html
  end

Auszug aus der Dokumentation:

Accessors zum Festlegen von Sicherheitsbeschränkungen.

Dies ist eine nützliche Sache, wenn Sie RedCloth zur Formatierung an öffentlichen Orten (z.B. Wikis) verwenden, wo Sie nicht möchten, dass Benutzer HTML für schlechte Dinge missbrauchen.

Wenn filter_html gesetzt ist, wird HTML, das nicht vom Textilprozessor erstellt wurde, escaped. Alternativ, wenn sanitize_html gesetzt ist, kann HTML den Textilprozessor durchlaufen, aber nicht autorisierte Tags und Attribute werden entfernt.

1 Stimmen

Aber Vorsicht vor Pre- und Code-Tag-Exploits. z.B. (traue ich mich das zu riskieren?) !!!!Mausefalle!!!!

2voto

Noel Walters Punkte 1823

Dies funktioniert für mich und schützt vor jedem XSS-Angriff, den ich ausprobiert habe, einschließlich der onmouse... Handler in pre und code Blöcken:

<%= RedCloth.new( sanitize( @comment.body ), [:filter_html, :filter_styles, :filter_classes, :filter_ids] ).to_html -%>

Das anfängliche Säubern entfernt viele potenzielle XSS-Exploits, einschließlich Mouseovers.

Soweit ich das beurteilen kann: :filter_html entkommt den meisten html Tags abgesehen von code und pre. Die anderen Filter sind dort, weil ich nicht möchte, dass Benutzer Klassen, IDs und Styles anwenden.

Ich habe gerade meine Kommentarseite mit deinem Beispiel getestet

"Foo" 

und es hat das rogue body Tag komplett entfernt

Ich verwende Redcloth Version 4.2.3 und Rails Version 2.3.5

0voto

sleske Punkte 77202

Es sieht so aus, als würde Textil einfach nicht das unterstützen, was du willst.

Du möchtest wirklich nur eine sorgfältig kontrollierte Teilmenge von HTML zulassen, aber Textil ist darauf ausgelegt, beliebiges HTML zuzulassen. Ich glaube nicht, dass du Textil in dieser Situation überhaupt verwenden kannst (es sei denn, es unterstützt diese Art von Einschränkung).

Was du wahrscheinlich brauchst, ist eine spezielle "eingeschränkte" Version von Textil, die nur "sicheres" Markup zulässt (wie das genau definiert werden kann, könnte jedoch schwierig sein). Ich weiß jedoch nicht, ob so etwas existiert.

Du könntest dir BBCode anschauen, das das mögliche Markup einschränken kann.

0 Stimmen

Es gibt auch Markdown (das Stack Overflow verwendet), daringfireball.net/projects/markdown

0 Stimmen

Ja, habe auch über Markdown nachgedacht. Aber soweit ich weiß, führt Stackoverflow zusätzliches Escaping durch (einige Blogposts von Jeff haben das bestätigt). Markdown ermöglicht auch beliebiges HTML.

0 Stimmen

@David Zaslavsky: Lesen Sie von der offiziellen Website (daringfireball.net/projects/markdown/syntax#overview): "Für jede Formatierung, die nicht von der Markdown-Syntax abgedeckt ist, verwenden Sie einfach HTML selbst."

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