文档章节

Spring REST 配置CSRF防护

C
 Canaan_
发布于 06/14 21:18
字数 826
阅读 26
收藏 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
粉丝 16
博文 288
码字总数 125851
作品 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
01-Spring Security框架学习--入门(二)

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

weir_will
08/07
0
0
Spring Security4 之 csrf

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

山海经
2016/11/13
256
1

没有更多内容

加载失败,请刷新页面

加载更多

一步步编写自己的PHP爬取代理IP项目(二)

这一章节我们正式开展我们的爬虫项目,首先我们先要知道哪个网站能获取到免费代理IP,目前比较火的有西刺代理,快代理等,这里我们拿西刺代理作为例子。 这里就是一个个免费的IP地址以及各自...

NateHuang
25分钟前
1
0
11-利用思维导图梳理JavaSE-Java的反射机制

11-利用思维导图梳理JavaSE-Java的反射机制 主要内容 1.反射与Class类 1.1.反射概念 1.2.Class类 1.3.实例化Class类 1.4.反射的作用 1.5.Class对象的作用 2.反射的深入应用 2.1.调用无参的成...

飞鱼说编程
32分钟前
1
0
How to serve the world from home computer?

最近在开发web应用,很想知道,通过公网来访问,效果会不会好。今天在做家务的时候,突然想到,如果我自己写一个ip转发的工具,不就可以实现了吗?但是转过头一想,这么大众的想法,怎么会没...

pearma
48分钟前
1
0
今天在码云遇到一个很有意思的人 for Per.js

今天在码云遇到一个很有意思的人,他在我的Per.js项目下面评论了一句,大意为“你试试这句代码,看看速度到底是你快还是Vue快”【当然,这个评论被我手残不小心删掉了...】。 然后我就试了,...

Skyogo
今天
50
0
Java -------- 首字母相关排序总结

Java 字符串数组首字母排序 字符串数组按首字母排序:(区分大小写) String[] strings = new String[]{"ba","aa","CC","Ba","DD","ee","dd"}; Arrays.sort(strings); for (int i ...

切切歆语
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部