2009-07-31 12 views
11

Ich verwende HTML Purifier, um meine Anwendung vor XSS-Angriffen zu schützen. Zurzeit bereinigt ich Inhalte von WYSIWYG-Editoren, da dies der einzige Ort ist, an dem Benutzer XHTML-Markup verwenden dürfen.HTML Purifier - was zu reinigen?

Meine Frage ist, sollte ich HTML Purifier auch auf Benutzername und Passwort in einem Login-Authentifizierungssystem (oder auf Eingabefelder der Anmeldeseite wie E-Mail, Name, Adresse usw.) verwenden? Gibt es eine Chance von XSS Angriff dort?

Antwort

13

Sie sollten alles reinigen, was jemals auf einer Seite angezeigt werden könnte. Denn mit XSS-Angriffen setzen Hacker <script> Tags oder andere schädliche Tags ein, die auf andere Websites verweisen können.

Passwörter und E-Mails sollten in Ordnung sein. Passwörter sollten niemals angezeigt werden und E-Mails sollten ihren eigenen Validator haben, um sicherzustellen, dass sie im richtigen Format sind.

Schließlich immer daran denken, htmlentities() auf Inhalt zu setzen.

Oh .. und schauen Sie sich auch filter_var an. Sehr gute Möglichkeit, Variablen zu filtern.

+3

+1 für filter_var –

+4

Für normale Texteingaben, filter_var sollte ausreichen. Für Text, der HTML-Tags zulässt, sollten Sie HTMLPurifier verwenden. – Nikko

3

XSS-Risiken bestehen dort, wo von einem Benutzer eingegebene Daten von anderen Benutzern angezeigt werden können. Auch wenn diese Daten derzeit nicht angezeigt werden, gehen Sie nicht davon aus, dass dies nicht erforderlich ist.

Soweit der Benutzername und das Passwort gehen, sollten Sie niemals ein Passwort anzeigen oder es sogar in einem Formular speichern, das angezeigt werden kann (z. B. mit sha1() verschlüsseln). Beschränken Sie sich bei Nutzernamen auf zulässige Zeichen wie [A-Za-z0-9_]. Schließlich, wie die andere Antwort vorschlägt, verwenden Sie Ihre Sprachen-html-Entitätscodierungsfunktion für alle eingegebenen Daten, die reservierte oder spezielle HTML-Zeichen enthalten können, was verhindert, dass diese Daten Syntaxfehler verursachen, wenn sie angezeigt werden.

1

Nein, ich würde HTMLPurifier nicht für Benutzername und Passwort während der Login-Authentifizierung verwenden. In meinen Anwendungen verwende ich alphanumerische Benutzernamen und einen Eingabevalidierungsfilter und zeige sie mit htmlspecialchars mit ENT_QUOTES an. Dies ist sehr effektiv und viel schneller als HTML Purifier. Ich habe noch einen XSS-Angriff mit einer alphanumerischen Zeichenfolge zu sehen. Und BTW HTMLPurifier ist nutzlos, wenn alphanumerische Inhalte trotzdem gefiltert werden. Wenn Sie also die Eingabezeichenfolge durch einen alphanumerischen Filter erzwingen, dann hat es keinen Sinn, sie mit HTML purifier anzuzeigen. Wenn es um Passwörter geht, sollten sie niemals an irgendjemanden angezeigt werden, was die Möglichkeit von XSS ausschließt. Und wenn Sie aus irgendeinem perversen Grund die Passwörter anzeigen möchten, sollten Sie Ihre Anwendung so gestalten, dass nur der Besitzer des Passworts in der Lage ist, es zu sehen, sonst sind Sie sehr beschäftigt und XSS ist der kleinste deine Sorge!

0

HTML-Purifier dauert HTML als Eingabe und produziert HTML als Ausgabe. Sein Zweck ist es, dem Benutzer zu ermöglichen, html mit einige Tags, Attribute und Werte einzugeben, während andere herausgefiltert werden. Dies verwendet eine Whitelist, um Daten zu verhindern, die Skripts enthalten können. Das ist nützlich für so etwas wie einen WYSIWYG-Editor.

Benutzernamen und Passwörter auf der anderen Seite sind nicht HTML. Sie sind Klartext, so HTML-Luftreiniger ist keine Option. Der Versuch, HTML Purifier hier zu verwenden, würde entweder die Daten beschädigen oder XSS-Angriffe ermöglichen.

Zum Beispiel, es läßt die folgende durch unverändert, was XSS Probleme verursachen kann, wenn sie als Attributwert in einigen Elementen eingefügt:

" onclick="javascript:alert()" href=" 

Oder wenn jemand spezielle Symbole in ihrem Passwort zu verwenden versucht, und eingegeben :

<password 

dann würde ihr Passwort leer werden, und es viel einfacher zu erraten machen.

Stattdessen sollten Sie den Text codieren. Die Codierung erforderlich ist, hängt vom Kontext ab, aber Sie können htmlentities verwenden, wenn diese Werte ausgeben, wenn Sie Regel # 0 und Regel # 1 kleben, an den OWASP XSS Prevention Cheat Sheet