文档章节

Spring REST 配置CSRF防护

C
 Canaan_
发布于 06/14 21:18
字数 826
阅读 51
收藏 20

Spring REST 配置CSRF防护

内容从以下几个方面展开

  • 什么是CSRF防护
  • 如何运用CSRF进行防御(WEB)
  • 如何将CSRF防御,运用到REST中 

1.什么是CSRF

CSRF 攻击简单来说,是多Tab页面浏览器的一个安全漏洞,比如你正在访问A网站,此时如果浏览器有你的cookie,并且session没有过期,此时你去访问B网站,那么B网站可以直接调用A网站的接口,而A网站则认为是你本人进行的操作。以下是图示:

2.如何进行防御

对CSRF进行防御,可以通过加Token.也就是当你访问A网站的时候,A会给你一个token,然后,接下去的post请求,你需要把token带上,不然服务器则拒绝接收这个请求。 
- 1. token的产生:spring-security 4.0之后默认开启csrf,可以直接产生csrf token。 
- 2. token的存储:这里存储是指服务端的存储,token是存储在session中。 
- 3. token的传送:token可以通过cookie,也可以放在header中自定义的属性中。 
- 4. token的接收和返回:前段收到http respon 之后,需要把相应的token返回回来。 
- 5. token校验:服务器端对自己持有的token和客户端反馈回来的token进行校验,决定是否拒绝服务(拒绝服务可以自定义)。

3.REST 的CSRF防御

一般写REST服务(也就是直接@ResponseBody)返回json字符串,则可以把token加在header里头的自定义属性中,为什么不能直接加在header中的cooike里,spring-sercurity官方给出的答案:

One might ask why the expected CsrfToken isn’t stored in a cookie by default. This is because there are known exploits in which headers (i.e. specify the cookies) can be set by another domain. This is the same reason Ruby on Rails no longer skips CSRF checks when the header X-Requested-With is present. See this webappsec.org thread for details on how to perform the exploit. Another disadvantage is that by removing the state (i.e. the timeout) you lose the ability to forcibly terminate the token if it is compromised.

翻译一下: 
- 1.cookie可以被其他域设置 
- 2.cookie是没有状态的,但是如果是session(含有过期时间),则可以使session过期,从而使token失效。(如有出入,欢迎拍砖)

既然如此,那么需要在header中加入token,我们只要注册一个Filter,就可以完成这个功能: 
- STEP 1 创建Filter

/**
 *
 * "将CSRF TOKEN加入到header中"
 *
 * Created by hzlaojiaqi on 2016/9/13.
 */
public class CsrfTokenResponseHeaderBindingFilter extends OncePerRequestFilter {
    protected static final String REQUEST_ATTRIBUTE_NAME = "_csrf";
    protected static final String RESPONSE_HEADER_NAME = "X-CSRF-HEADER";
    protected static final String RESPONSE_PARAM_NAME = "X-CSRF-PARAM";
    protected static final String RESPONSE_TOKEN_NAME = "X-CSRF-TOKEN";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, javax.servlet.FilterChain filterChain) throws ServletException, IOException {
        CsrfToken token = (CsrfToken) request.getAttribute(REQUEST_ATTRIBUTE_NAME);

        if (token != null) {
            response.setHeader(RESPONSE_HEADER_NAME, token.getHeaderName());
            response.setHeader(RESPONSE_PARAM_NAME, token.getParameterName());
            response.setHeader(RESPONSE_TOKEN_NAME , token.getToken());
        }

        filterChain.doFilter(request, response);
    }
}

 

  • STEP 2 加入到过滤器中

    @Configuration
    @EnableWebSecurity
    public class SecurityConfigure extends WebSecurityConfigurerAdapter {
    
    private static final Logger THIRDPARTY_LOG = LoggerFactory.getLogger("THIRDPARTY_LOGGER");
    
    @Autowired
    UserService userService;
    
    protected  void configure(HttpSecurity httpSecurity) throws Exception {
        CsrfTokenResponseHeaderBindingFilter csrfTokenFilter = new CsrfTokenResponseHeaderBindingFilter();
        CustomAccessDeniedHandler accessDeniedHandler=new CustomAccessDeniedHandler();
        httpSecurity.addFilterAfter(csrfTokenFilter,CsrfFilter.class);
    }
    }

实验

    1. 首先进行Get请求,获取header中CSRF的token(图片忘记保存了)
    1. 在header中加入token,发起post请求
    1. 不在header中加入token,发起post请求

情况2 带header发起token

 
可以看到,服务器端正确返回数据。

情况3 不带header发起token

 
可以看到,服务器端 拒绝了我们的请求。

© 著作权归作者所有

共有 人打赏支持
C
粉丝 17
博文 305
码字总数 132073
作品 0
福州
私信 提问
SpringBoot +spring security 与CSRF有关的几个 问题

1、问题 开启 csrf 后 列表页面没有数据 页面console.log(403) 2、科普 首先,科普一下,什么是"CSRF"? 这是一个web应用安全的问题,CSRF(Cross-site request forgery)跨站请求伪造,也被称...

douruanliang
05/15
0
0
让Spring Security 来保护你的Spring Boot项目吧

参考资料: 书籍:Spring实战(第4版) 第9章和第14章 Spring Security 参考手册 初识 Spring Security 程序猿DD的Spring Security学习笔记 Spring Security 简介 Spring Security是一个能够为...

潇潇漓燃
05/19
0
0
Spring Boot2.0使用Spring Security

一、Spring Secutity简介 Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括...

大魔王先生
08/20
0
0
Spring Security4 之 csrf

CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。为了防止跨站提交攻击,通常会配置csr...

山海经
2016/11/13
256
1
01-Spring Security框架学习--入门(二)

一、入门案例 Spring Security 自定义登录界面 通过之前的一节 01-Spring Security框架学习--入门(一)的简单演示,Spring security 使用框架自带的登录界面,下面的案例将使用自己定义的登...

weir_will
08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GROUP BY GROUPING SETS

GROUPING SETS 子句是 SELECT 语句的 GROUP BY 子句的扩展。通过 GROUPING SETS 子句,您可采用多种方式对结果分组,而不必使用多个 SELECT 语句来实现这一目的。这就意味着,能够减少响应时...

hblt-j
10分钟前
0
0
selenium之表格的定位

真的勇士, 敢于直面惨淡的warning、 敢于正视淋漓的error 目录 被测试网页的HTML代码 1.遍历表格所有单元格 2.定位表格中的某个元素 3.定位表格中的子元素 总结 浏览器网页常常会包含各类表...

程序猿拿Q
15分钟前
0
0
adb命令启动展讯平台工厂模式

adb命令启动展讯工厂模式: adb shell am start com.sprd.engineermode/com.sprd.engineermode.EngineerModeActivity...

东街小霸王
16分钟前
0
0
mtu值怎样设置才网速最快

一、什么是 MTU 值 1 从字面上来说,MTU 是英文 Maximum Transmission Unit 的缩写,即最大传输单元,它的单位是字节。 在我们常用的以太网中,MTU 一般是 1500,而无线路由器默认一般是 14...

Clarence_D
34分钟前
1
0
McAfee阻止邮件发送功能

自己写的邮件发送功能,在本地机器上可以发送,但是放到服务器上面之后就不能发送了,捕获到的异常是“以一个访问权限不允许的方式做了一个访问套接字的尝试”,找了很久,终于发现是被McAfe...

壹峰
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部