Spring MVC 中如何防止 XSS?现在我只是将所有输出用户文本的地方放入 JSTL <c:out> 标签或 fn:escapeXml() 函数,但这似乎很容易出错,因为我可能会错过一个地方。

有没有一种简单的系统方法来防止这种情况发生?也许像过滤器什么的?我通过指定收集输入 @RequestParam 我的控制器方法上的参数。

有帮助吗?

解决方案

在春天,你可以逃脱从<form>标记生成的JSP页面的HTML。这封闭了很多途径XSS攻击,并能自动三种方式来完成:

有关在web.xml文件整个应用程序:

<context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
</context-param>

有关该文件本身在所有形式的给定页上:

<spring:htmlEscape defaultHtmlEscape="true" /> 

对于每个格式:

<form:input path="someFormField" htmlEscape="true" /> 

其他提示

尝试 XSSFilter

我用Hibernate验证经由@Valid所有输入对象(结合和@RequestBody JSON,请参阅 HTTPS ://dzone.com/articles/spring-31-valid-requestbody )。所以@org.hibernate.validator.constraints.SafeHtml对我来说是一个很好的解决方案。

休眠SafeHtmlValidator取决于org.jsoup,所以它需要增加一个项目依赖关系:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.1</version>
</dependency>

有关豆User与字段

@NotEmpty
@SafeHtml
protected String name;

用于与值<script>alert(123)</script>在控制器

更新尝试
@PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
public void update(@Valid @RequestBody User user, @PathVariable("id") int id) 

@PostMapping
public void createOrUpdate(@Valid User user) {

,则抛出BindException用于与默认消息结合和MethodArgumentNotValidException@RequestBody

name may have unsafe html content

验证作品以及用于结合,如之前持续。 应用程序可以在 http://topjava.herokuapp.com/

待测试

当你正试图阻止XSS,但将上下文是很重要的。作为一个例子,如何和什么逃逸是非常不同的,如果要在内部变量中,而不是在一个HTML标记或HTML属性输出数据的JavaScript代码段ouputting数据。

我有这样的一个例子在这里: http://erlend.oftedal.no/blog /?blogid = 91

另外检出OWASP XSS预防小抄: HTTP://www.owasp .ORG / index.php的/ XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

所以,简单的答案是,确保你逃脱输出像通过Tendayi Mawushe建议,但要特别注意在HTML属性或当你在输出数据的JavaScript。

在首位你如何收集用户输入?如果您使用的是FormController这个问题/答案可以帮助:

弹簧:逸出输入结合命令时

始终手动检查方法,您使用的标签,并确保他们总是在最后逃生(一次)。框架有许多缺陷和差异在这一方面。

的概述: http://www.gablog.eu/online/node/91

而不是仅仅依靠 <c:out />, ,还应该使用 antixss 库,它不仅可以编码,还可以清理输入中的恶意脚本。OWASP 是最好的库之一 反萨米, ,它非常灵活,可以根据要求进行配置(使用 xml 策略文件)。

例如如果应用程序仅支持文本输入,则最通用 政策文件 可以使用 OWASP 提供的工具来清理和删除大部分 html 标签。同样,如果应用程序支持需要各种html标签的html编辑器(例如tinymce),则可以使用更灵活的策略,例如 eBay 政策文件

**To avoid XSS security threat in spring application**
  

解决问题XSS是过滤所有的文本框的形式   在提交表单的时间。

    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 ...............");
            }

        }

<强>命名RequestWrapper.java代码第二类是:

包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;
    }
  

的唯一事情是保持在web.xml文件中的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>

<强>的/ *表示用于从浏览器发出的每个请求,它将调用     CrossScriptingFilter类。这将分析所有的部件/元件从请求传来&     将取代由黑客把空字符串即

所有的JavaScript代码
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top