使用SpringSecurity处理CSRF攻击

8次阅读

共计 1399 个字符,预计需要花费 4 分钟才能阅读完成。

CSRF 漏洞现状
CSRF(Cross-site request forgery)跨站请求伪造,也被称为 One Click Attack 或者 Session Riding,通常缩写为 CSRF 或 XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与 XSS 非常不同,XSS 利用站点内的信任用户,而 CSRF 则通过伪装成受信任用户的请求来利用受信任的网站。与 XSS 攻击相比,CSRF 攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比 XSS 更具危险性。CSRF 是一种依赖 web 浏览器的、被混淆过的代理人攻击(deputy attack)。
POM 依赖
<!– 模板引擎 freemarker –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!– Security (只使用 CSRF 部分) –>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
配置过滤器
@SpringBootApplication
public class Application {

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

/**
* 配置 CSRF 过滤器
*
* @return {@link org.springframework.boot.web.servlet.FilterRegistrationBean}
*/
@Bean
public FilterRegistrationBean<CsrfFilter> csrfFilter() {
FilterRegistrationBean<CsrfFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new CsrfFilter(new HttpSessionCsrfTokenRepository()));
registration.addUrlPatterns(“/*”);
registration.setName(“csrfFilter”);
return registration;
}
}
在 form 请求中添加 CSRF 的隐藏字段
<input name=”${(_csrf.parameterName)!}” value=”${(_csrf.token)!}” type=”hidden” />
在 AJAX 请求中添加 header 头
xhr.setRequestHeader(“${_csrf.headerName}”, “${_csrf.token}”);
jQuery 的 Ajax 全局配置
jQuery.ajaxSetup({
“beforeSend”: function (request) {
request.setRequestHeader(“${_csrf.headerName}”, “${_csrf.token}”);
}
});

正文完
 0