Alternative zur Verwendung von c: out, um XSS zu verhindern

8

Ich arbeite daran, Cross-Site-Scripting (XSS) in einer Java-basierten Spring-Webanwendung zu verhindern. Ich habe bereits einen Servlet-Filter ähnlich diesem Beispiel Ссылка implementiert Bereinigt alle Eingaben in die Anwendung. Als zusätzliche Sicherheitsmaßnahme möchte ich auch die gesamte Ausgabe der Anwendung in allen JSPs bereinigen. Ich habe einige Nachforschungen angestellt, um zu sehen, wie das gemacht werden könnte, und zwei ergänzende Optionen gefunden.

Einer davon ist die Verwendung des Attributs defaultHtmlEscape von Spring. Dies war sehr einfach zu implementieren (ein paar Zeilen in web.xml), und es funktioniert gut, wenn Ihre Ausgabe eines der Tags von Frühjahr durchläuft (dh: Nachricht oder Formular-Tags). Die andere Option, die ich gefunden habe, besteht darin, EL-Ausdrücke wie ${...} nicht direkt zu verwenden und stattdessen <c:out value="${...}" />

zu verwenden

Dieser zweite Ansatz funktioniert perfekt, aber aufgrund der Größe der Anwendung, an der ich arbeite (über 200 JSP-Dateien). Es ist eine sehr umständliche Aufgabe, alle unangemessenen Verwendungen von EL-Ausdrücken durch das c:out -Tag ersetzen zu müssen. Außerdem würde es in Zukunft eine mühsame Aufgabe werden, dafür zu sorgen, dass alle Entwickler sich an diese Konvention halten, das c:out -Tag zu verwenden (ganz zu schweigen davon, wie viel unlesbarer der Code wäre).

Gibt es eine alternative Möglichkeit, die Ausgabe von EL-Ausdrücken zu umgehen, die weniger Codeänderungen erfordern würden?

    
ggreiner 16.12.2010, 21:34
quelle

3 Antworten

10

Seit Servlet 2.5 / JSP 2.1 können Sie eine benutzerdefinierte ELResolver Was macht das? Sie können es in ServletContextListener#contextInitialized() .

%Vor%

In ELResolver#getValue() können Sie den Job für die Entwurzelung ausführen.

Ihr einziges Problem ist, dass Sie HTML dort nicht anzeigen können, wo es erlaubt ist (dh bereits von schädlichen Tags / Attributen über eine Whitelist bereinigt, so dass Sie unschuldige Tags wie Jsoup can ).

Das stimmt, ich stimme nicht der Notwendigkeit zu, XSS während input durch Filter zu verlassen, wie Sie im ersten Absatz der Frage erwähnt haben. Sie riskieren Doppelflucht. Sie müssen nur an genau dem Punkt entkommen, an dem es möglicherweise Schaden anrichten kann, d. H. Gerade in der Ansichtsseite dort, wo es unter HTML eingegrenzt wird, der Ausgabe . Ich empfehle, diesen sogenannten XSS-Filter loszuwerden und ihn darauf zu konzentrieren, ihn entweder mit JSTL <c:out> oder fn:escapeXml() (oder einem benutzerdefinierten EL-Resolver) zu fixieren, aber das ist definitiv nicht der normale Ansatz. Die zukünftigen Code-Betreuer werden sehr dankbar sein.

    
BalusC 17.12.2010 01:39
quelle
1

Dieser Blogpost beschreibt einen benutzerdefinierten ELResolver, der nicht funktioniert EL-Ausdruckswerte vom Typ String. Durch die Registrierung dieses benutzerdefinierten ELResolvers wird die Ausgabe aller EL-Ausdrücke verhindert. In den Ausnahmefällen, in denen eine JSP programmgesteuert HTML ausgeben muss, benötigen Sie einen Mechanismus, der keinen EL-Ausdruck enthält, wie z. B. ein benutzerdefiniertes Tag oder ein Scriptlet:

%Vor%     
Chin Huang 06.01.2011 06:49
quelle
1

Ich stimme zu, dass Sie nicht c: out um jede Variable verwenden sollten. Ich habe einen Blog geschrieben, in dem ich beschreibe, warum Ссылка

Es berührt vieles, was hier gesagt wird.

    
mck 24.04.2011 13:04
quelle

Tags und Links