文档章节

Spring REST 配置CSRF防护

C
 Canaan_
发布于 06/14 21:18
字数 826
阅读 11
收藏 20
点赞 0
评论 0

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
粉丝 13
博文 229
码字总数 98860
作品 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 Security4 之 csrf

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

山海经
2016/11/13
256
1
【Spring Security】基本原理(一)

介绍 SpringSecurity核心功能:认证(身份校验,你是谁),授权(你能干什么),攻击防护(防止伪造身份) 原理 REST API:相当于应用的controller,用户的增删该查的一些服务 Spring Secur...

zlt995768025
04/29
0
0
java 防止 XSS 攻击的常用方法总结

在前面的一篇文章中,讲到了java web应用程序防止 csrf 攻击的方法,参考这里 java网页程序采用 spring 防止 csrf 攻击. ,但这只是攻击的一种方式,还有其他方式,比如今天要记录的 XSS 攻击...

凯文加内特
2015/08/11
0
2
锱铢必较:在spring boot中使用spring security的filter防止CSRF攻击

在一个spring boot项目中,需要防止CSRF攻击,按理说应该集成spring security才对。 但是不想使工程变得太复杂,这时可以只把spring security中的相关filter引入来进行。 在pom中添加相关依赖...

大神带我来搬砖
03/06
0
0
spring-oauth-server 2.0.0 发布,基于 Spring-Boot 2.0

经过一年多的时间后,我们发布了 spring-oauth-server 2.0.0版本. 使用Spring-Boot 2.0版本重构, 进入模块化,零配置时代. 更符合技术发展与实际需要. 相比之前的版本(1.0及之前版本), 更新如下...

monkeyk7
04/21
0
0
进阶-使用Spring Security3.2搭建LDAP认证授权和Remember-me(2)

接上 进阶-使用Spring Security3.2搭建LDAP认证授权和Remember-me(1) javaconfig 使用javaconfig,只需要生成两个类,就可以完成XML配置下的3个步骤。这两个类非别是: 继承于org.springfra...

xpbug
2014/02/21
0
2
Eureka2.0集群 高可用的认证服务实现与搭建

Springboot-2.0.2.RELEASE Eureka认证后,服务注册失败问题。 随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在...

边鹏_尛爺鑫
05/28
0
11
Spring Security 学习总结(2)

从一个最简单的Spring Security Java Configuration 看起 configGlobal 这个名字不重要,重要的是在一个注解了 @EnableWebSecurity 或@EnableWebMvcSecurity或 @EnableGlobalMethodSecurity ......

平江夜弹
2015/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

自定义OkHttp的UA

背景 上次的问题很明显 由于我们的ua清一色OkHttp导致快速定位到内部应用。 既然如此我们是否考虑可以在UA上做点手脚。 自定义我们的UA呢??? 分析 首先UA在 均为okhttp/3.2.0 大概率是由于...

Mr_Qi
12分钟前
0
0
【scikit-learn】01:使用案例对sklearn库进行简单介绍

sklearn学习笔记:Quick Start 源地址:http://scikit-learn.org/stable/tutorial/basic/tutorial.html # -*-coding:utf-8-*-''' Author:kevinelstri Datetime:2017.2.16'''......

wangxuwei
16分钟前
0
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

问题终结者
17分钟前
0
0
Apache配置时.htaccess失效不起作用的原因分析

.htaccess 失效的原因 1. 重写规则有问题,检查自己的重写规则 2.Apache配置问题,配置中没有配置启用 rewrite a2enmod rewrite 3.网站配置文件没有启用配置需要配置 000-default.conf <Dire...

TU-DESGIN
37分钟前
1
0
两个求最大公约数C/C++算法实现

#include<stdio.h> #include<time.h> #include <iostream>using namespace std;//求最大公约数 LCD(Largest Common Division)//短除法 //m=8251, n=6105; int LCD_ShortDiv(int m, ......

失落的艺术
43分钟前
1
0
QueryPerformanceCounter

windows的Sleep函数,睡眠线程指定毫秒数,可以用来做毫秒延时。 对于微秒延时,没有一个现成的函数,但是可以通过 QueryPerformanceFrequency QueryPerformanceCounter 来间接实现。原理就是...

开飞色
今天
1
0
log4j2使用AsyncRoot不显示行号问题处理

<AsyncRoot level="info" includeLocation="true"> <AppenderRef ref="File"/></AsyncRoot><!--1.异步logger,还需要在pom.xml中添加disruptor的依赖。2.includeLocation结合异......

小翔
今天
3
0
安卓手机上 K 歌,声音延迟怎么解决?

这篇文章可以为你提供一个解决录音和播放同步问题的思路,而且解决了声音从手机传输到耳机上有延时的问题。 初识音频 在开始之前,我先简单介绍一下音频相关的基础知识,方便下文理解。 我们...

编辑部的故事
今天
2
0
使用token实现在有效期内APP自动登录功能

使用token实现在有效期内APP自动登录功能 http://sevennight.cc/2016/07/19/auto_login_impl.html

风云海滩
今天
2
0
Spring Boot集成RabbitMQ发送接收JSON

默认情况下RabbitMQ发送的消息是转换为字节码,这里介绍一下如何发送JSON数据。 ObjectMapper 最简单发送JSON数据的方式是把对象使用ObjectMapper等JSON工具类把对象转换为JSON格式,然后发送...

小致dad
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部