-
Notifications
You must be signed in to change notification settings - Fork 652
CSRF
csrf基本配置: https://github.com/JoyChou93/java-sec-code/commit/590891b895f256732de2b5fedbee91ad3164fd56
配置uri白名单和请求头的白名单: https://github.com/JoyChou93/java-sec-code/commit/72a54fa5dfe5d91a13090d18b9c25114ea0e4f9a
使用spring-security自带的csrf模块 + thymeleaf模板进行csrf校验。
访问 http://localhost:8080/csrf/ ,点击submit,提示CSRF passed.
,标识csrf校验通过。此时可以看到源代码的CsrfToken
和cookie里的CsrfToken
。
1、spring-security默认token存在session里,但存在后端多台服务器情况,session不能同步的问题,所以一般使用cookie模式。
2、spring-security的5.x版本不适配springboot 1.5,因为1.5的springboot的spring-core版本是4.x,所以spring-security改为4.x即可适配。
3、thymeleaf使用th:action
的form表单,spring版本3.2+并且Thymeleaf版本2.1+ ,会自动添加token。
Using @EnableWebMvcSecurity instead of @EnableWebSecurity to enable automatic injection of CSRF token with Thymeleaf tags. Also use
instead of with Spring 3.2+ and Thymeleaf 2.1+ to force Thymeleaf to include the CSRF token as a hidden field automatically (source Spring JIRA).
<form name="f" th:action="@{/csrf/post}" method="post">
<input type="text" name="input" />
<input type="submit" value="Submit" />
</form>
比如,上面的代码渲染出来的结果是:
<form name="f" method="post" action="/csrf/post">
<input type="text" name="input" />
<input type="submit" value="Submit" />
<input type="hidden" name="_csrf" value="8581b0e1-f1b9-4226-8abb-51c9daac8470" /></form>
4、默认情况POST请求会进行拦截,GET|HEAD|TRACE|OPTIONS
请求不会拦截,但是都是可以定制。