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)を再度使用するように強制されましたが、これは問題です。
コードに基づいて、完全に実行可能なサンプルプロジェクトを作成しました。
すべてうまくいきました。私のgithubから完全なソースをダウンロードできます https://github.com/mehditahmasebi/spring/tree/master/spring-xss-filter そしてコマンド「mvnwspring-boot:実行」およびブラウザタイプ: http:// localhost:8080/personService/test?name = foobar なので、XSSRequestWrapper.stripXSSで結果を確認できます。
このソースコードがお役に立てば幸いです。
いくつかの説明:
プロジェクト構造:
それらに飛び込みますが、私は重要な行をコピーしただけでした:
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