Skip to content
JoyChou edited this page Jul 28, 2019 · 7 revisions

相关代码

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请求不会拦截,但是都是可以定制。

Clone this wiki locally