java - 如何在没有 Spring Boot 的情况下阻止或防止 Spring MVC 4 应用程序的 XSS

标签 java spring-mvc xss

如何保护、清理采用原始 JSON 主体并通常输出 JSON 响应且不使用 Spring Boot 的应用程序。我只看到一个可能有效并使用 JsonComponent 的好例子。如果我们不使用 jsoncomponent,如何过滤掉请求以从整个 JSON 请求正文中删除不良的跨站脚本标记?另外,检测请求正文中的 XSS 标记并抛出错误也是可以的。

还在寻找一种全局解决方案,可以保护 JSON 请求的所有输入/输出并将该代码添加到一个区域中。我们可以使用 JSR bean 验证,但我们必须命中所有定义的属性和变量。

是否还可以查看 JSON 有效负载以获取可能包含脚本标记的数据。

最佳答案

好吧,我终于做到了,我将我的解决方案发布为响应而不是评论,它很实用,但不是很强大,如果您希望我使用异常处理程序等改进它,请告诉我

AntiXssDemoApplication.java 是

包 com.melardev.stackoverflow.demos.antixssdemo;

import com.melardev.stackoverflow.demos.antixssdemo.filters.AntiXssFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import javax.servlet.Filter;

@SpringBootApplication
@ServletComponentScan
public class AntiXssDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(AntiXssDemoApplication.class, args);
    }

}

AntiXssFilter

package com.melardev.stackoverflow.demos.antixssdemo.filters;

import org.springframework.web.util.HtmlUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class AntiXssFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter initialized");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String userInput = servletRequest.getParameter("param");
        if (userInput != null && !userInput.equalsIgnoreCase(HtmlUtils.htmlEscape(userInput)))
            throw new RuntimeException();
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

Controller

package com.melardev.stackoverflow.demos.antixssdemo.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/")
public class HomeController {
    @RequestMapping("/xss-reflected")
    @ResponseBody
    public String xssDemo(@RequestParam("param") String userInput) {
        return userInput;
    }
}

演示:

  1. 在 localhost:8080/xss-reflected 打开浏览器?param=看看这个反射内容,有效!!
  2. 在 localhost:8080/xss-reflected 打开浏览器?param=

    看看这个反射内容,有效!!

在步骤 2 中,我使用了 html 标签 h2。您应该看到 Filter 抛出运行时异常,发生的情况是: Filter 会拦截所有 url(因为 urlPatterns=/**),每次拦截都会调用 doFilter,如果用户提供了 Html 内容,那么 HtmlUtils.htmlEscape 会返回过滤后的字符串,换句话说,返回的字符串与原始的,这意味着用户在他的 json 输入中提供了 Html,这不是我们所期望的,所以我们抛出异常, 如果返回的字符串与 htmlEscape(userInput) 返回的字符串相同,这意味着用户没有提供任何 Html 内容,在这种情况下,我们让请求管道像往常一样流动,使用 filterChain.doFilter(servletRequest, servletResponse); 我没有使用实时 XSS 演示,因为 Chrome 很可能会保护您,因为它是任何人都检测到的非常基本的反射 XSS ...

Spring Boot骨架项目是从https://start.spring.io/下载的 将 Web 作为唯一的启动依赖项。

编辑:改进的代码

关于java - 如何在没有 Spring Boot 的情况下阻止或防止 Spring MVC 4 应用程序的 XSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49373299/

相关文章:

java - 如何将两个列表项结果显示为一个,以获得多个结果。在 selenium Webdriver 中使用 java

Java RegEx 反向引用不起作用

java - 为什么具有短路操作的并行 Java Stream 会评估 Stream 的所有元素,而顺序 Stream 则不会?

javascript - 我应该插入 <script> 还是应该评估?

javascript - AngularJS - 如何使控制台或恶意攻击无法访问 token ?

未找到 Java Card framework.exp

java - 使用 Spring Security 登录的链接

java - 如何使用 java @Configuration Spring 配置以过滤模式运行 jersey

java - 我如何在 Spring Boot/MVC 中创建错误处理程序(404、500...)

javascript - window.location = window.location 是否易受 XSS 影响