Alternative zu c:aus, um zu verhindern, XSS
Arbeite ich auf, um cross-site-scripting (XSS) in einer Java -, Spring-basierte Web-Anwendung. Ich habe bereits ein servlet-filter ähnlich wie in diesem Beispiel http://greatwebguy.com/programming/java/simple-cross-site-scripting-xss-servlet-filter/, die bereinigt werden alle Eingaben in der Anwendung. Als zusätzliche Sicherheitsmaßnahme würde ich auch gerne desinfizieren Sie alle Ausgaben der Anwendung in allen JSPs. Ich habe einige der Forschung getan, um zu sehen, wie dies getan werden könnte, und fand zwei komplementäre Möglichkeiten.
Einer von Ihnen ist der Einsatz von Spring defaultHtmlEscape
Attribut. Dies war sehr einfach zu implementieren (ein paar Zeilen in web.xml), und es funktioniert Super, wenn Ihr Ausgang wird über eine Frühlings-tags (ie: Meldung-oder form-tags). Die andere Möglichkeit, die ich gefunden habe, ist nicht direkt in EL-Ausdrücken wie ${...}
und stattdessen <c:out value="${...}" />
Dass der zweite Ansatz funktioniert perfekt, jedoch aufgrund der Größe der Anwendung, ich arbeite auf (200+ JSP-Dateien). Es ist eine sehr langwierige Aufgabe zu haben, zum alle zu ersetzen unsachgemäße Nutzung des EL-Ausdrücke mit dem c:out
tag. Auch wäre es eine langwierige Aufgabe in der Zukunft sicherstellen, dass alle Entwickler an diese Konvention verwenden Sie die c:out
tag (nicht zu erwähnen, wie viel mehr der code nicht lesbar wäre).
Gibt es alternativen Ausweg aus der Ausgabe von EL-Ausdrücken erfordern würde, dass weniger code-änderungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit Servlet 2.5/JSP 2.1 Sie können eine benutzerdefinierte
ELResolver
, die das tut. Sie können sich registrieren, es inServletContextListener#contextInitialized()
.In der
ELResolver#getValue()
Sie tun konnte, die Flucht-job.Ihre einzige problem ist, dass Sie nicht in der Lage, um die Anzeige von HTML-dort, wo es erlaubt ist (D. H. bereits bereinigt von bösartigen tags/Attribute nach Art einer whitelist, so dass Sie am Ende mit unschuldigen tags wie Jsoup kann tun).
Sagte, ich Stimme der Notwendigkeit zu entkommen, XSS während Eingang durch die
Filter
wie Sie erwähnt wird in 1. Absatz der Frage. Sie Gefahr, doppelt zu entkommen. Sie brauchen nur zu entkommen, es in genau der Punkt, wo kann es möglicherweise Schaden, d.h. gerade in der view-Seite, wo es eingebettet unter HTML, die Ausgabe. Ich empfehlen Sie, um loszuwerden, die so genannte XSS-filter und konzentrieren Sie sich auf die Festsetzung es in der Ansicht Seite, indem Sie entweder über JSTL<c:out>
oderfn:escapeXml()
(oder eine benutzerdefinierte EL-resolver, aber das ist definitiv nicht die normale Annäherung). Die Zukunft code-Betreuer sehr dankbar.fn:escapeXml
zu entkommen HTML. Es generiert'
, die nicht eine standard-HTML-entity.'
gültig in HTML-und XML - (wie funktioniertc:out
).escapeXml
Funktion. Um sicher zu sein, sah ich es in der JSTL-Spezifikation, wenn dies ausdrücklich erwähnt.WEB-INF/lib
Ordner, richtig? Ihreweb.xml
ist auch deklariert als pro Servlet 2.5?In diesem blog-post beschreibt eine benutzerdefinierte ELResolver entweicht, EL-Ausdruck Wert vom Typ String. Die Registrierung dieser Brauch ELResolver dazu, dass es zu entkommen, den Ausgang aller EL-Ausdrücke. In den außergewöhnlichen Fällen, in denen eine JSP müssen programmgesteuert HTML-Ausgabe, benötigen Sie einen Mechanismus, der sich nicht um eine EL-expression, wie ein benutzerdefiniertes tag oder scriptlet:
Stimme ich dir zu, sollte nicht auf c:um jede einzelne der Variablen.
Ich schrieb einen blog beschreiben, warum bei http://tech.finn.no/2011/04/08/xss-protection-whos-responsibility/
Er streift vieles, das hier gesagt.