XSS Prevention mit einem Filter
-
Servus,
kurze Frage: Wenn ich davon ausgehe, dass User-Input auf meiner Seite nie wirklich berechtigt irgendein anderes Zeichen als {[a-z][A-Z][ ][0-9]} verwenden darf, dann ist doch ein Filter, der einfach jegliche Zeichen, die nicht in diesem Satz enthalten sind, rauslöscht, absolut sicher gegen XSS?
Mal angenommen ich setze die Enkodierung auf den Seiten und in den Response/Request-Headern immer auf UTF-8.
Übersehe ich hier was oder sollte das jegliche andere Art von Arbeit (anpassen der JSP/JS/HTML/was auch immer View seiten) sparen und dennoch absolut sicher sein?
-
Du musst User Daten immer korrekt "escapen". Dabei geht es um Steuerzeichen. Wenn du alle Steuerzeichen korrekt entfernst, sind die User Daten "sane".
Alles bis auf a-z 0-9 und leerzeichen zu entfernen ist sicher. Aber ist es notwendig? Du verlierst damit ja auch zB accents, euro zeichen, etc...
-
Notwendig ... ja: 60k Zeilen JSP/JS code, die sich nie um XSS-Präventionen gekümmert haben, das ist so ziemlich der Hingergrund.
Man könnte ja noch den ein oder anderen special character erlauben, aber eben wirklich gar nichts in Richtung ("?{} ... etc. ).
Ich kann mir gerade nicht vorstellen, dass ich irgendwo kritische Zeichen wirklich erlauben muss.
Auch bei so etwas wie der E-Mail Adresse sollte nicht mehr als ".@" noch dazu-kommen. Das sollte unkritisch sein, egal ob in HTML,JS,URL, attribute oder was auch immer Kontext.Der Hintergrund ist halt mit möglichst wenig Aufwand möglichst sicher gegen XSS Angriffe zu werden.
-
Kontext ist IMMER wichtig.
Wenn du zB den User Content in einem JS Kontext verwendest ist plötzlich "\n" ein no go Zeichen, während es in einem HTML Kontext zB vollkommen ungefährlich ist.
Wenn du XSS Schutz wo einbaust, musst du das Designtechnsich machen. Durch den Code gehen und überall strip_dangerous_chars() aufrufen ist keine gute Idee. Du musst jedesmal wenn der Zugriff auf User Content stattfindet die korrekten sicheren Funktionen verwenden.
-
Das möchte ich, ehrlich gesagt, vermeiden, da es bedeutet etliche Datein zu analysieren und umzuschreiben.
Momentan wird in fast allen JSP und JS Datein naiv mit allen Daten umgegangen. Und an genügenden Stellen sind das eben Daten, die der Benutzter eingegeben hat.
Sicher ist es doof, dass die Situation überhaupt so wie sie ist enstehen konnte.
Allerdings ist mein Ziel jetzt erstmal so schnell wie möglich diese Sicherheits-Lücken zu entfernen. Dass man sich danach noch um eine saubere und zukunfts-orientierte Lösung kümmert ist natürlich nicht ausgeschlossen.
Ich verstehe, was du mit dem Kontext meinst. Ich weiß, dass zB HTML-escapt'er Code trotzdem nicht in JavaScript-Kontext sicher ist.
Aber selbst wenn man ALLE Kontexte betrachtet, kann man wohl einfach die Menge an aller Sonderzeichen, die in diesen Kontexten jeweils gefährlich sind, mit einem Filter aus den Requests rausnehmen.
Ich muss jemandem nicht erlauben sowas wie <"?\n... in einer Sucheingabe zu verwenden, die zB nach Artikeln sucht.
Und wenn ich das nicht muss, dann spar ich mir doch die Arbeit?Im Endeffekt bin ich doch auf der sicheren Seite, wenn mein Filter einfach alle kritischen Zeichen löscht. Ob das jetzt für HTML kritische Zeichen sind oder für Java-Script ist mir dabei eigentlich egal, sicher ist es trotzdem weil einfach nur Daten übrig bleiben, die in keinem Kontext Schaden anrichten können?
-
Arbeit sparst du dir, aber ob du damit deine User glücklich machst wenn du mir zB kein ö in meinem Namen erlaubst oder ich kein "<3" posten darf ist ein anderes thema.
Ich bin immer gegen entfernen von Zeichen, ich finde das escapen ist viel besser. Das ist aber eben Kontext abhängig.
Von einem reinen Sicherheitstandpunkt ist entfernen alles möglichen gefährlichen Zeichen natürlich ok.
-
Naja, sowas wie äöü kann man ja noch erlauben. Ich würd halt eigentlich alles erlauben, bis auf die entsprechend kritischen Zeichen, die in einer der möglichen Kontexte Ärger machen.
Aber dann ist das soweit klar, danke dir für die Bestätigung und schönes Wochenende