Wie verhindere ich, Menschen zu tun, XSS in Spring MVC?
-
23-09-2019 - |
Frage
Was soll ich tun XSS in Spring MVC zu verhindern? Im Moment bin ich gerade dabei, alle Orte, an denen ich Ausgangsnutzdaten Text in JSTL <c:out>
Tags oder fn:escapeXml()
Funktionen, aber dieser Fehler scheint anfällig als könnte ich einen Platz verpassen.
Gibt es eine einfache systematische Art und Weise, dies zu verhindern? Vielleicht wie ein Filter oder so etwas? Ich sammle Eingabe von @RequestParam
Parameter auf meinen Controller-Methoden angeben.
Lösung
Im Frühjahr können Sie die HTML von JSP-Seiten von <form>
Tags erzeugt entkommen. Damit schließt sich aus eine Menge Möglichkeiten für XSS-Angriffe, und automatisch in drei Arten erfolgen kann:
Für die gesamte Anwendung in der web.xml
-Datei:
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
Für alle Formen auf einer bestimmten Seite in der Datei selbst:
<spring:htmlEscape defaultHtmlEscape="true" />
Für jede Form:
<form:input path="someFormField" htmlEscape="true" />
Andere Tipps
Versuchen Sie XSSFilter .
Ich benutze Hibernate Validator über @Valid
für alle Eingangsobjekte (Bindung und @RequestBody
json findet Sie unter https : //dzone.com/articles/spring-31-valid-requestbody ). So @org.hibernate.validator.constraints.SafeHtml
ist für mich eine gute Lösung.
Hibernate SafeHtmlValidator
hängt von org.jsoup
, so dass es nötig ist ein weiteres Projekt Abhängigkeiten hinzuzufügen:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.1</version>
</dependency>
Für bean User
mit Feld
@NotEmpty
@SafeHtml
protected String name;
für Update-Versuch mit dem Wert <script>alert(123)</script>
in Controller
@PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
public void update(@Valid @RequestBody User user, @PathVariable("id") int id)
oder
@PostMapping
public void createOrUpdate(@Valid User user) {
geworfen BindException
für die Bindung und MethodArgumentNotValidException
für @RequestBody
mit Standardmeldung:
name may have unsafe html content
Validator arbeitet auch für die Bindung, wie vor persistierenden. Apps können unter http://topjava.herokuapp.com/
getestet werdenWenn Sie versuchen, XSS zu verhindern, ist es wichtig, den Kontext zu denken. Als ein Beispiel, wie und was zu entkommen ist ganz anders, wenn Sie Daten in einer Variablen in einem JavaScript-Schnipseln sind ouputting zu Ausgeben von Daten in einem HTML-Tag oder ein HTML-Attribute gegenüber.
ich das ein Beispiel hier haben: http://erlend.oftedal.no/blog /? blogid = 91
Auch die OWASP XSS Cheat Sheet Prävention Kasse: http: //www.owasp .org / index.php / XSS_% 28Cross_Site_Scripting% 29_Prevention_Cheat_Sheet
So die kurze Antwort ist, stellen Sie sicher, Ausgang zu entkommen wie von Tendayi Mawushe vorgeschlagen, aber besondere Sorgfalt walten lassen, wenn Sie Daten ausgeben, in HTML-Attributen oder JavaScript.
Wie sammeln Sie Benutzereingaben in erster Linie? Diese Frage / Antwort kann helfen, wenn Sie eine FormController
verwenden:
Überprüfen Sie immer manuell die Methoden, Tags, die Sie verwenden, und stellen Sie sicher, dass sie immer (wieder) entweichen am Ende. Frameworks haben viele Fehler und Unterschiede in diesem Aspekt.
Eine Übersicht: http://www.gablog.eu/online/node/91
Statt nur auf <c:out />
der Berufung, eine AntiXSS Bibliothek sollte auch verwendet werden, die kodieren nicht nur, sondern auch schädliches Skript in Eingabe sanieren. verfügbar Eines der besten Bibliothek ist OWASP Antisamy , es ist sehr flexibel und kann so konfiguriert werden (xml-Richtlinie mit Dateien) je nach Anforderung.
Für z.B. Wenn eine Anwendung unterstützt nur Texteingabe dann generischsten Richtliniendatei von OWASP bereitgestellt können, die saniert und entfernt von den hTML-Tags am meisten verwendet werden. Ebenso, wenn die Anwendung Unterstützung HTML-Editoren (wie tinymce), die alle Arten von HTML-Tags benötigen, eine flexiblere Politik kann Gebrauch wie ebay Richtliniendatei
**To avoid XSS security threat in spring application**
Lösung der XSS Problem ist es, alle Textfelder in Form zu filtern zu der Zeit die Form einreichen.
It needs XML entry in the web.xml file & two simple classes.
java code :-
The code for the first class named CrossScriptingFilter.java is :
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
public class CrossScriptingFilter implements Filter {
private static Logger logger = Logger.getLogger(CrossScriptingFilter.class);
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
logger.info("Inlter CrossScriptingFilter ...............");
chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);
logger.info("Outlter CrossScriptingFilter ...............");
}
}
Der Code zweite Klasse mit dem Namen RequestWrapper.java ist:
Paket com.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.log4j.Logger;
public final class RequestWrapper extends HttpServletRequestWrapper {
private static Logger logger = Logger.getLogger(RequestWrapper.class);
public RequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
}
public String[] getParameterValues(String parameter) {
logger.info("InarameterValues .. parameter .......");
String[] values = super.getParameterValues(parameter);
if (values == null) {
return null;
}
int count = values.length;
String[] encodedValues = new String[count];
for (int i = 0; i < count; i++) {
encodedValues[i] = cleanXSS(values[i]);
}
return encodedValues;
}
public String getParameter(String parameter) {
logger.info("Inarameter .. parameter .......");
String value = super.getParameter(parameter);
if (value == null) {
return null;
}
logger.info("Inarameter RequestWrapper ........ value .......");
return cleanXSS(value);
}
public String getHeader(String name) {
logger.info("Ineader .. parameter .......");
String value = super.getHeader(name);
if (value == null)
return null;
logger.info("Ineader RequestWrapper ........... value ....");
return cleanXSS(value);
}
private String cleanXSS(String value) {
// You'll need to remove the spaces from the html entities below
logger.info("InnXSS RequestWrapper ..............." + value);
//value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
//value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
//value = value.replaceAll("'", "& #39;");
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
value = value.replaceAll("(?i)<script.*?>.*?<script.*?>", "");
value = value.replaceAll("(?i)<script.*?>.*?</script.*?>", "");
value = value.replaceAll("(?i)<.*?javascript:.*?>.*?</.*?>", "");
value = value.replaceAll("(?i)<.*?\\s+on.*?>.*?</.*?>", "");
//value = value.replaceAll("<script>", "");
//value = value.replaceAll("</script>", "");
logger.info("OutnXSS RequestWrapper ........ value ......." + value);
return value;
}
Das einzige, was geblieben ist der XML-Eintrag in der Datei web.xml:
<filter>
<filter-name>XSS</filter-name>
<display-name>XSS</display-name>
<description></description>
<filter-class>com.filter.CrossScriptingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Der / * gibt für jede Anforderung, dass von Browser gemacht, wird es nennen CrossScriptingFilter Klasse. Der alle Komponenten analysieren wird / Elemente kamen von der Anfrage & ersetzt alle die JavaScript-Tags setzen durch Hacker mit leeren String d.h