Skip to content
JoyChou edited this page May 31, 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、如果使用spring mvc的form表单,或者Thymeleaf 2.1+以上并且使用@EnableWebSecurityCsrfToken会自动引进来。可参考:https://docs.spring.io/spring-security/site/docs/5.0.x/reference/html/taglibs.html#the-csrfinput-tag

    <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