web-dev-qa-db-ja.com

XSSを防ぐためにSpringRESTfulでフィルターを作成するにはどうすればよいですか?

spring 4.2.6.RELEASEから使用しており、バックエンドはRESTサービスです。そして今、私は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は使用しません。コントローラーでStringEscapeUtils.escapeHtml(name)を再度使用するように強制されましたが、これは問題です。

4
user10227658

コードに基づいて、完全に実行可能なサンプルプロジェクトを作成しました。

すべてうまくいきました。私のgithubから完全なソースをダウンロードできます https://github.com/mehditahmasebi/spring/tree/master/spring-xss-filter そしてコマンド「mvnwspring-boot:実行」およびブラウザタイプ: http:// localhost:8080/personService/test?name = foobar なので、XSSRequestWrapper.stripXSSで結果を確認できます。

このソースコードがお役に立てば幸いです。


いくつかの説明:

プロジェクト構造:

  • POM.xml
  • WebConfig.Java for SpringWeb構成
  • アプリケーションを起動するための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);
}

2番目の変更は、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

12
Mehdi Tahmasebi