文档章节

spring security 防CSRF攻击

Clover286
 Clover286
发布于 2017/03/15 17:59
字数 670
阅读 1498
收藏 0

一.介绍:

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

    Spring Security 为了防止跨站提交攻击提供了CSRF保护功能,该功能在Spring Security 3时就已经存在,默认是不启用,Spring Security 4默认启用了,所以由Spring Security 3升级到Spring Security 4就会有所有POST方式请求的服务会调用失败的问题,原因在于:启用csrf后,所有http请求都被会CsrfFilter拦截,而CsrfFilter中有一个私有类DefaultRequiresCsrfMatcher。

private static final class DefaultRequiresCsrfMatcher implements RequestMatcher {

   private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");

   /* (non-Javadoc)
    * @see org.springframework.security.web.util.matcher.RequestMatcher#matches(javax.servlet.http.HttpServletRequest)
   */
   public boolean matches(HttpServletRequest request) {
      return !allowedMethods.matcher(request.getMethod()).matches();
   }
}

从这段源码可以发现,POST方法被排除在外了,也就是说只有GET|HEAD|TRACE|OPTIONS这4类方法会被放行,其它Method的http请求,都要验证_csrf的token是否正确,而通常post方式调用rest服务时,又没有_csrf的token,所以校验失败。

二.CSRF保护功能相关操作

2.1如何禁用?

2.1.1Security XML配置文件中配置:

<csrf disabled="true" />

2.1.2如果你使用Java configuration配置:

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable();
  }
}

 

2.2如何启用?

说明:前面介绍中以经说了,spring4.0默认是开启的,所以只需要在前端页面配置CSRF_token即可。

如果前端页面没有CSRF_token,则一般会报错如下

HTTP Status 403 - Expected CSRF token not found. Has your session expired?

type Status report

message Expected CSRF token not found. Has your session expired?

description Access to the specified resource has been forbidden.

 

2.2.1 JSP页面

情况1:JSP表单域,可增加一个标签<security:csrfInput/>,这个标签会生成一个隐藏域。

<%@ taglib prefix='security' uri='http://www.springframework.org/security/tags' %> 

<form action="login" class="login-form" method="post" style="display: inline-table;">  
   //其他表单域
   <security:csrfInput/>
   <button type="submit" class="btn btn-success btn-block">登 录</button>  
</form>

//<security:csrfInput/>实际会生成<input type="hidden" name="_csrf" value="XXXXXXXXXXXXXXXXXXXX"> 

情况2:对于非表单域,增加<security:csrfMetaTags/>,该标签可在报文头增加crsf的token。

<%@ taglib prefix='security' uri='http://www.springframework.org/security/tags' %>  

<!DOCTYPE html>  
<html lang="zh">  
  <head>  
    <meta charset="utf-8">  
    <title>首页</title>  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <security:csrfMetaTags/> 


//这个标签会生成以下内容
<meta name="_csrf_parameter" content="_csrf" />  
<meta name="_csrf_header" content="X-CSRF-TOKEN" />  
<meta name="_csrf" content="XXXXXXXXXXXXXXXXXX" /> 

情况3:类似情况1

<form action="login"  method="post"> 
   <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">   

</form>

情况4:jquery提交的处理

(function(){  
    $(document).ajaxSend(function(e,xhr,opt) {  
        if (opt.type == "POST"){  
            var header = $('meta[name=_csrf_header]').attr('content');  
            var token  = $('meta[name=_csrf]').attr('content');   
            if (header != '' && token != ''){             
                xhr.setRequestHeader(header, token);  
            }  
        }  
    });  
})();  

本文转载自:https://my.oschina.net/shajin/blog/786930

Clover286
粉丝 10
博文 210
码字总数 66809
作品 0
武汉
程序员
私信 提问
01-Spring Security框架学习--入门(二)

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

weir_will
2018/08/07
0
0
锱铢必较:在spring boot中使用spring security的filter防止CSRF攻击

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

大神带我来搬砖
2018/03/06
0
0
更加优雅地配置Spring Securiy(使用Java配置和注解)

Spring Security 借助一系列Servlet Filter 来提供安全性功能,但是借助Spring的小技巧,我们只需要配置一个Filer就可以了,DelegatingFilterProxy是一个特殊的Servlet Filter,它本身所做的...

小小庄
2016/10/14
0
0
SpringBoot +spring security 与CSRF有关的几个 问题

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

douruanliang
2018/05/15
0
0
Spring Security 学习总结(1)

最近在看Spring Security, 把学习的过程记录一下。 spring security 版本:3.2.7.RELEASE + Java Configuration. Spring Security 是什么? Spring Security 是一个框架,提供比较全面的安全服...

平江夜弹
2015/06/01
226
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
27分钟前
3
0
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
6
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部