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.

War es hilfreich?

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 werden

Wenn 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:

Spring: Eingang zu entkommen, wenn auf Befehlsbindung

Ü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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top