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}");
}
});
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。