2009-07-10 12 views
2

Ich baue eine einfache Web-basierte Forum-Anwendung. Ich möchte Benutzern erlauben, html in ihre Beiträge aufzunehmen, möchte aber Cross-Site-Scripting stoppen. Meine derzeitige Strategie ist es, keine "Skript" -Tags zuzulassen, sondern nur "style" - und "href" -Attribute auf jedem Tag zuzulassen und nicht zuzulassen, dass "href" -Werte mit "javascript:" beginnen. Gibt es etwas, das ich vermisse?Unsafe Html

AKTUALISIEREN: Ich löste dies mit einer "Whitelist" von HTML-Elementen. Wenn ungültige Elemente gefunden werden, entferne ich das Tag, lasse aber das innere HTML. Dies löst das Problem des Kopierens und Einfügens von Personen aus einem MS Word-Dokument. Ich schaute auch in , aber stieß auf einige Probleme damit, wie es Stilattribute auf Spannweiten behandelte (d. H. Sie entfernt). Wenn ich das schaffen kann, kann ich zu dieser Lösung wechseln.

Antwort

11

Sie sollten the approach of StackOverflow und anderen Websites folgen und eine whitelist für beide Tags und Attribute verwenden. Es klingt, als ob Sie eine Whitelist für Attribute verwenden, was gut ist. Sie sollten dies auch für Elemente tun, damit die Leute keine Dinge in Form, iframe, meta, frameset etc. schleichen (von denen Sie keine erwähnt haben).

+0

Ich fing eigentlich mit einer weißen Liste an. Das Problem, mit dem ich konfrontiert wurde, betraf den Text, der aus MS Word kopiert und eingefügt wurde. Ich bin mir nicht sicher, ob ich alle Elemente vorhersehen kann, die ich in diesem Fall bekommen könnte. Der Text geht in einen WYSIWYG-Editor, so dass es für den Benutzer nicht klar ist, welcher HTML-Code tatsächlich an den Server gesendet wird. Außerdem sind die Benutzer nicht wirklich technisch versiert, so dass sie nicht wissen, wie sie das Problem beheben können, wenn das Einfügen aus Word ihnen eine Fehlermeldung gibt. – herbrandson

+3

Einfügen von MS Word in WYSIWYG-Editoren ist ein Schmerz! Einige Editoren (FCKEditor und ich denke, TinyMCE - meine bevorzugte) können Sie die Strg + V und Einfügen-Funktionen des Browsers abfangen und zwingen den Benutzer, die MS Word-Inhalte als Nur-Text einfügen. Es wird nicht über Formatierung übertragen, aber es wird sauber sein! TinyMCE hat tatsächlich auch eine Funktion "Aus Word einfügen". –

+0

Eine mögliche Lösung besteht darin, dass Ihre WYSIWYG-Steuerung auf der Clientseite eine Bereinigung durchführt. Auf diese Weise kann der Großteil des notorisch schlechten HTML-Codes behoben werden, und Sie können weiterhin eine Server-Whitelist für die Sicherheit verwenden. –

7

Stellen Sie sicher, dass Sie iframe, object, embed entfernen. Es ist ziemlich viel.

Vielleicht wäre es besser, statt Markdown zulassen?

+0

Toller Punkt! +1 für dich :) – herbrandson

+1

Ich schaute auf Markdown, entschied mich aber dagegen. Ich denke, ein WYSIWYG-Editor ist intuitiver für nicht-technische Benutzer. – herbrandson

+2

Es gibt keinen Widerspruch zwischen dem Speichern des Textes als Markdown und dem Anzeigen als WYSIWYG. Wenn Sie eine Variante erstellen, die XML verwendet, können Sie das WYSIWYG erstellen, indem Sie es durch XSLT pumpen. –

2

Ich würde versuchen, alle onclick oder wirklich on[anything] Tags zu entfernen. Es könnte einfacher sein, eine Liste von erlaubten statt einer Blacklist zu erstellen.

0

Was sagen Sie:

style='background-image:url("my-site-which-inserts-something-that-will make-you-look-bad")' 

Und nicht ganz verbunden: stellen Sie sicher, dass, wenn Sie zulassen, dass Menschen Dateien auf die Seiten laden (images/txt/was auch immer), dass sie von einem anderen serviert Domainname.

+0

Wahr. Und zu diesem Zweck (Aus diesem Beitrag http://stackoverflow.com/questions/551480/writing-xss-filter) -for-xhtml-based-on-whitelist) – herbrandson

-1

Wenn Sie PHP verwenden Sie alles, aber die Elemente Streifen aus können Sie mit strip_tags

strip_tags(string,allow) 

Dies würde Ausgang zulassen möchten:

<?php 
echo strip_tags("Hello <b><i>world!</i></b>","<b>"); 
?> 

Hallo Welt!

sollten Sie diesen Ansatz mit:

mysql_real_escape_string(); 
htmlentities(); 
+0

Dies ist nicht ausreichend, weil es nichts für gefährliche Attribute tut (wie die 'On's von marcc erwähnt) –

+2

Das Problem ist nicht wirklich, wie Sie die Tags entfernen Es sollten keine Tags erlaubt sein. – herbrandson

+0

auch, ich benutze nicht PHP :( – herbrandson

1

A weißen Liste die sicherste Lösung.

Sie haben in einem Kommentar zum Einfügen von Word erwähnt. Zählen Sie nicht auf alle Word-HTML-Elemente, es kommt oft mit Mist wie <o:p> für Absätze (die in der Regel nur wie erwartet im Internet Explorer funktionieren) zurück. Sie können die meisten davon finden, aber es könnte leicht einige gefährliche Tags geben, vielleicht ein <o:script> Tag oder so.

Übrigens gibt es wirklich nicht so viele HTML-Tags. Die W3.org index of elements wird Ihnen helfen.

Verwandte Themen