gpt4 book ai didi

spring - 如何在 Spring RESTful 中创建过滤器以防止 XSS?

转载 作者:行者123 更新时间:2023-12-03 18:35:17 28 4
gpt4 key购买 nike

我从 Spring 4.2.6.RELEASE 使用,后端是休息服务。
现在我无法为 设置过滤器 防止 XSS

我的过滤器是:

@Component
@Order(1)
public class XSSFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void destroy() {
}

@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {

chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
}

}

XSSRequestWrapper 是:
public class XSSRequestWrapper extends HttpServletRequestWrapper {

public XSSRequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
}

@Override
public String[] getParameterValues(String 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] = stripXSS(values[i]);
}

return encodedValues;
}

@Override
public String getParameter(String parameter) {
String value = super.getParameter(parameter);

return stripXSS(value);
}

@Override
public String getHeader(String name) {
String value = super.getHeader(name);
return stripXSS(value);
}

private String stripXSS(String value) {

return StringEscapeUtils.escapeHtml(value);
}
}

并在 WebConfig 中扩展了 WebMvcConfigurerAdapter 类:
// -----------------------------------------------------
// Prevent XSS
// -----------------------------------------------------

@Bean
public FilterRegistrationBean xssPreventFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();

registrationBean.setFilter(new XSSFilter());
registrationBean.addUrlPatterns("/*");

return registrationBean;
}

我的休息课是:
@RestController
@RequestMapping("/personService")
public class PersonController extends BaseController<PersonDto, PersonCriteria> {

@RequestMapping( value= "/test" )
private void getTest2(@RequestParam String name) {

System.out.println(name);

System.out.println( StringEscapeUtils.escapeHtml(name) );

}

}

但它不起作用,没有任何错误或异常。
我怎样才能做到这一点并创建我自己的过滤器?我只使用 Java Config 而没有使用 XML。
在我的 Controller 中,我被迫再次使用 StringEscapeUtils.escapeHtml(name) ,这很糟糕。

最佳答案

我已经根据您的代码创建了一个完全可执行的示例项目。

一切顺利,你可以从我的 github https://github.com/mehditahmasebi/spring/tree/master/spring-xss-filter 下载完整的源代码并运行命令“mvnw spring-boot:run”和浏览器类型:http://localhost:8080/personService/test?name=foobar,所以你可以在 XSSRequestWrapper.stripXSS 中看到结果。

我希望这个源代码对你有帮助。

一些解释:

项目结构:

  • POM.xml
  • 用于 Spring Web 配置的 WebConfig.java
  • SpringBootApplication.java 用于启动应用程序
  • 你的类(PersonController.java、XSSFilter.java 和 XSSRequestWrapper.java)

  • 深入研究它们,但我只是复制重要的几行:

    pom.xml
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
    </dependency>
    <dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
    </dependency>
    </dependencies>

    WebConfig.java(在底部你可以看到你的bean):
    @Configuration
    @EnableWebMvc
    @EnableWebSecurity
    public class WebConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .anyRequest().permitAll()
    .and().csrf().disable();
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
    .allowCredentials(true)
    .allowedHeaders("*")
    .allowedMethods("GET, POST, PATCH, PUT, DELETE, OPTIONS")
    .allowedOrigins("*");
    }

    @Bean
    public FilterRegistrationBean xssPreventFilter() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();

    registrationBean.setFilter(new XSSFilter());
    registrationBean.addUrlPatterns("/*");

    return registrationBean;
    }
    }

    SpringBootApplication.java(用于启动项目):
    @SpringBootApplication
    public class SpringbootApplication extends SpringBootServletInitializer {

    /**
    * tomcat deployment needed
    */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(SpringbootApplication.class);
    }

    public static void main(String[] args) {
    SpringApplication.run(SpringbootApplication.class, args);
    System.out.println("Spring boot application started!");

    }
    }

    其他 java 源文件与您完全一样,但有 2 个更改:

    首先,我添加了一条 sysout 行,无需调试即可查看代码的踪迹:
    private String stripXSS(String value) {
    if(value != null)
    System.out.println("escapeHTML work successfully and escapeHTML value is : " + StringEscapeUtils.escapeHtml(value));
    return StringEscapeUtils.escapeHtml(value);
    }

    第二个变化是,我从 PersonController 评论了escapeHtml,正如你所说的不是一个好主意:
      @RequestMapping( value= "/test" )
    private void getTest2(@RequestParam String name) {

    System.out.println(name);

    // System.out.println( StringEscapeUtils.escapeHtml(name) );

    }

    你可以在我的 github https://github.com/mehditahmasebi/spring/tree/master/spring-xss-filter 上找到所有的源代码

    关于spring - 如何在 Spring RESTful 中创建过滤器以防止 XSS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51853375/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com