Spring Security csrf学习

转载 2016年08月29日 21:17:17

什么是csrf?

csrf又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点。CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI......而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。
举个例子,用户通过表单发送请求到银行网站,银行网站获取请求参数后对用户账户做出更改。在用户没有退出银行网站情况下,访问了攻击网站,攻击网站中有一段跨域访问的代码,可能自动触发也可能点击提交按钮,访问的url正是银行网站接受表单的url。因为都来自于用户的浏览器端,银行将请求看作是用户发起的,所以对请求进行了处理,造成的结果就是用户的银行账户被攻击网站修改。
解决方法基本上都是增加攻击网站无法获取到的一些表单信息,比如增加图片验证码,可以杜绝csrf攻击,但是除了登陆注册之外,其他的地方都不适合放验证码,因为降低了网站易用性
相关介绍:
http://baike.baidu.com/view/1609487.htm?fr=aladdin

http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

spring-security中csrf防御原理

在web应用中增加前置过滤器,对需要验证的请求验证是否包含csrf的token信息,如果不包含,则报错。这样攻击网站无法获取到token信息,则跨域提交的信息都无法通过过滤器的校验。
看一下CsrfFilter的源码就很好理解了
// 先从tokenRepository中加载token
        CsrfToken csrfToken = tokenRepository.loadToken(request);
        final boolean missingToken = csrfToken == null;
        // 如果为空,则tokenRepository生成新的token,并保存到tokenRepository中
        if(missingToken) {
            CsrfToken generatedToken = tokenRepository.generateToken(request);
            // 默认的SaveOnAccessCsrfToken方法,记录tokenRepository,
            // tokenRepository,response,获取token时先将token同步保存到tokenRepository中
            csrfToken = new SaveOnAccessCsrfToken(tokenRepository, request, response, generatedToken);
        }
        // 将token写入request的attribute中,方便页面上使用
        request.setAttribute(CsrfToken.class.getName(), csrfToken);
        request.setAttribute(csrfToken.getParameterName(), csrfToken);

        // 如果不需要csrf验证的请求,则直接下传请求(requireCsrfProtectionMatcher是默认的对象,对符合^(GET|HEAD|TRACE|OPTIONS)$的请求不验证)
        if(!requireCsrfProtectionMatcher.matches(request)) {
            filterChain.doFilter(request, response);
            return;
        }

        // 从用户请求中获取token信息
        String actualToken = request.getHeader(csrfToken.getHeaderName());
        if(actualToken == null) {
            actualToken = request.getParameter(csrfToken.getParameterName());
        }
        // 验证,如果相同,则下传请求,如果不同,则抛出异常
        if(!csrfToken.getToken().equals(actualToken)) {
            if(logger.isDebugEnabled()) {
                logger.debug("Invalid CSRF token found for " + UrlUtils.buildFullRequestUrl(request));
            }
            if(missingToken) {
                accessDeniedHandler.handle(request, response, new MissingCsrfTokenException(actualToken));
            } else {
                accessDeniedHandler.handle(request, response, new InvalidCsrfTokenException(csrfToken, actualToken));
            }
            return;
        }

        filterChain.doFilter(request, response);

使用样例

在spring-security配置文件中新增

<http auto-config="true">
		...
		<csrf/>
	</http>
然后在登录form表单中添加
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
就可以使用csrf防御。
然后在页面上获取token的方式是
<meta name="_csrf" content="${_csrf.token}"/>
	<meta name="_csrf_header" content="${_csrf.headerName}"/>
在发送请求的时候可以在http头消息中将token信息添加进去
var token = $("meta[name='_csrf']").attr("content");  
var header = $("meta[name='_csrf_header']").attr("content");  
$(document).ajaxSend(function(e, xhr, options) {  
    xhr.setRequestHeader(header, token);  
});  
说到这里一个基本的csrf的使用基本完毕了。
前面这部分内容参考自http://blog.csdn.net/behurry/article/details/38169279

spring-security中的csrf防御机制

什么是csrf?
  • behurry
  • behurry
  • 2014年07月27日 12:53
  • 22818

spring security下开启csrf,同时支持session.invalidate()调用

最近在做的一个java web项目,要求登录界面信息提交时使用https,登录成功后页面使用http,同时全站使用csrf防御。 然后https和http的访问会分别创建两个session,csrf的...
  • starrrr2
  • starrrr2
  • 2015年11月28日 21:19
  • 1593

Laravel框架学习(CSRF)

CSRF攻击原理及其防护1、CSRF攻击是what? CSRF是跨站请求伪造(Cross-site request forgery)的英文缩写。具体了解请自行百度。2、Laravel中如何避免CSR...
  • fationyyk
  • fationyyk
  • 2016年03月09日 09:23
  • 6543

跨域post 及 使用token防止csrf 攻击

1.利用iframe进行跨域post提交 2.csrf的攻击和防御措施 3.使用token保护请求 4.关于webapp跨域提交的问题...
  • u013934914
  • u013934914
  • 2015年12月30日 10:47
  • 12850

基于java config的springSecurity(三)--加入RememberMe,启用CSRF和增强密码

参考http://docs.spring.io/spring-security/site/docs/3.2.5.RELEASE/reference/htmlsingle/的Remember-Me Au...
  • xiejx618
  • xiejx618
  • 2015年01月12日 00:43
  • 11413

利用spring-security解决CSRF问题

从配置到原理,一步步讲解如何利用Spring的security框架来处理scrf问题。
  • u013185616
  • u013185616
  • 2017年04月22日 17:22
  • 5023

Spring REST 配置CSRF防护

Spring REST 配置CSRF防护内容从以下几个方面展开 什么是CSRF防护 如何运用CSRF进行防御(WEB) 如何将CSRF防御,运用到REST中 1.什么是CSRFCSRF 攻击简单来说,...
  • laojiaqi
  • laojiaqi
  • 2016年09月23日 13:14
  • 3712

Spring mvc拦截器防御CSRF攻击

CSRF(具体参考百度百科)       CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding...
  • jrn1012
  • jrn1012
  • 2016年10月07日 18:01
  • 4747

spring boot实战之CSRF(跨站请求伪造)

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站...
  • u014411966
  • u014411966
  • 2017年10月06日 17:03
  • 1056

spring-security中csrf防御原理

.. // 先从tokenRepository中加载token CsrfToken csrfToken = tokenRepository.loadToken(reques...
  • u011686226
  • u011686226
  • 2017年07月05日 16:36
  • 339
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Security csrf学习
举报原因:
原因补充:

(最多只允许输入30个字)