`
somefuture
  • 浏览: 1090066 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

同步令牌模式防范CSRF跨站请求伪造攻击

 
阅读更多

什么是“跨渣请求伪造”呢?这是信息安全领域的一个名词,译自英文“Cross Site Request Forgery”。

百度百科上介绍的很简单却很明了,大家可以看一下,我这里配合一些代码稍微多说一点。

 

假设我们要在银行网站上给老妈转100块钱,毕竟毕业这么多年了也没给过家里钱(虽然你认为他们都在赚钱不需要你给,况且你自己现在赚钱刚好可以经济独立,不过实际上爹妈还是很希望你能支援家里的)。这个转账的HTTP请求类似于这样:

POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid; Domain=bank.example.com; Secure; HttpOnly
Content-Type: application/x-www-form-urlencoded

amount=100.00&routingNumber=1234&account=9876

 你现在已经登录银行的网站了(你说你用的客户端?那当然没有这个危险性了,所以银行才都推荐U盾的),然后你新开了个标签页,进入一个“危机四伏”的网站(你傻啊,为什么要这样做。其实当别人没骗的时候我们都可以马后炮,但是没有足够的防范意识,任何时候我们被骗都是在鼓里)。

这个网站有一个链接,代码类似于这样:

<form action="https://bank.example.com/transfer" method="post">
  <input type="hidden"      name="amount"      value="100.00"/>
  <input type="hidden"      name="routingNumber"      value="evilsRoutingNumber"/>
  <input type="hidden"      name="account"      value="evilsAccountNumber"/>
  <input type="submit"      value="点我拿红包!"/>
</form>

 除了一个“拿红包”的按钮之外,其他都是隐藏域。一看抢红包了,赶紧抢吧!这个表单提交后,和上面的请求是完全一样的。尽管这个网站没有你的cookie信息,可是你提交的时候cookie照样会被发送,所以它完全不需要拿到你的cookie。

你说:好像只要我足够小心,不去点击按钮就行了。当然不是,因为给你个按钮让你点是貌似愚蠢的做法,这个网站打开的同时,它的javascript代码说不定就不停的发生那个请求了。而你完全不知道。

 

为什么会这样?

因为接收action的服务器并不知道请求是跨站的,跨不跨站对于服务器来说没什么两样。

知道了这一点,我们的解决方法也就应运而生了:增加点东西让其他站点提供不了(因为只用cookie是不够的),这样服务器去验证这个域不就可以了吗。

一种方案是同步令牌模式。你的每一次请求,除了session数据外,都会提供服务器经response返回的随机串作为一个单独的http参数。提交后服务器会验证这个随机串。而其他网站是拿不到这个随机串的。

与之前的请求相比,只多了一个参数_csrf:

POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid; Domain=bank.example.com; Secure; HttpOnly
Content-Type: application/x-www-form-urlencoded

amount=100.00&routingNumber=1234&account=9876&_csrf=<secure-random>

对于经过浏览器进行访问和发送接收请求的场景,防范CSRF攻击都有必要。 

 

 Spring Secure是怎么防范CSRF攻击呢?

首先,我们使用spring secure应该保证action的HTTP动词是合适的,不应该使用GET请求处理编辑性活动。使用POST要好得多。有的框架检测到token(就是上面提到的随机串)不合法马上就将用户登出要求重新登录。而Spring是产生一个403状态。

spring默认是开启 csrf防范的(如果使用命名空间需要开发者显示开启),如果想关闭,可以使用disable()方法:

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends
   WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  }
}

 最后,要保证在除了GET外的请求中都包含_csrf域。不然,连登出都会失败(咦,登出不是GET吗?所以最好用POST)。

 

分享到:
评论

相关推荐

    CSRF攻击技术

    CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击方式,它利用了用户的已登录状态,通过诱导用户点击恶意链接或访问恶意网站,来执行非用户意愿的操作。这种攻击通常发生在Web应用程序中,对...

    csrf漏洞.rar

    **CSRF(Cross-Site Request Forgery,跨站请求伪造)漏洞详解** CSRF是一种网络攻击方式,攻击者通过伪造用户的请求,使用户在不知情的情况下执行非本意的操作。这种漏洞通常发生在需要用户身份验证的Web应用中,...

    PHP BBS论坛

    设置CSRF令牌则可防范跨站请求伪造。 2. **搜索功能**:论坛通常有强大的全文搜索功能,实现关键词匹配和高亮显示。可利用MySQL的全文索引或第三方搜索引擎如Sphinx、Elasticsearch来优化搜索性能。 3. **负载均衡...

    达内-ajax串讲系列

    使用Ajax时,必须注意安全性问题,如防止XSS(跨站脚本攻击)和CSRF(跨站请求伪造)。确保对用户输入进行验证和过滤,同时,利用CSRF令牌等技术来防范CSRF攻击。 综上所述,Ajax技术在现代Web开发中扮演着重要角色...

    留言板论坛系统 bbs

    开发者需要对输入数据进行过滤和校验,使用预编译语句或参数化查询来防御SQL注入,设置安全的Cookie策略防止XSS,以及添加CSRF令牌来防范跨站请求伪造。 至于“源码帝国”这个文件名,可能指的是一个提供开源代码的...

    java_web 用户只能在一处登陆源码

    SSO系统需要处理跨站请求伪造(CSRF)和跨站脚本攻击(XSS)。CSRF防范通常通过在请求中包含不可预测的令牌来实现,而XSS防范则需要对用户输入进行适当的过滤和编码。 8. **代码结构与设计模式**: 源码可能包含...

    tzxblog博客系统-概要设计V1.01

    5. CSRF防范:通过生成并验证CSRF令牌,防止跨站请求伪造。 六、功能设计 1. 首页:展示最新或热门文章,可能包含搜索框、分类导航等元素,提供用户快速浏览内容的入口。 2. 文章详情:展示完整文章内容,支持评论...

    100道ajax面试题

    - 跨站请求伪造(CSRF):使用令牌机制,每次请求携带唯一令牌。 - 数据泄露:使用HTTPS加密传输数据。 2. **同源策略:** - 为了保护用户的隐私和数据安全,浏览器实施了同源策略。该策略限制了一个文档或脚本...

    ajax实战(Part4)

    跨站脚本攻击(XSS)与跨站请求伪造(CSRF) Ajax应用需要防范这两种常见的安全威胁。XSS可以通过验证和过滤用户输入,编码输出等方式预防;CSRF则需要通过在请求中包含不可预测的令牌来防止。 ### 10. 性能优化 ...

    基于PHP的交易网站平台php版源码.zip

    3. **CSRF(跨站请求伪造)保护**:在关键操作(如支付、修改账户信息)中使用令牌来防止未授权的第三方操作。 **支付集成**:交易网站通常需要集成第三方支付网关,如PayPal、Alipay或WeChat Pay。这涉及到API调用...

    Spring+LDAP实现单点登录

    需要防范跨站请求伪造(CSRF)、中间人攻击(Man-in-the-Middle)以及会话劫持等风险。Spring Security提供了相应的防护措施,如CSRF令牌、HTTPS强制、会话固定保护等。 8. **部署与配置**:在实际项目中,需要根据...

    1剑盛二面准备试题.txt1剑盛二面准备试题.txt

    73. **CSRF攻击及其防范**:CSRF(跨站请求伪造)攻击者通过诱导用户在已认证的会话中执行非本意的操作,防范方法包括使用验证码、验证HTTP Referer、添加令牌(Token)等。 ### 异常知识点 74. **throw与throws的...

    一些前端面试题.pdf

    **CSRF(跨站请求伪造)**:攻击者诱使已认证用户执行未经授权的操作。防范措施包括验证请求来源和使用双令牌机制。 ### MVC、MVVM和MVP模式 **MVC**(Model-View-Controller):一种经典的软件架构模式,将应用...

    会话服务

    8. **会话劫持和跨站请求伪造(CSRF)防护**:会话服务需要防范这两种常见的网络安全威胁。会话劫持是攻击者获取并使用用户的会话ID,而CSRF攻击则利用用户的已登录状态执行非预期操作。有效的防护措施包括使用安全...

    posts-app

    10. **安全考虑**:JavaScript应用需要处理用户输入,因此需要防范XSS(跨站脚本)和CSRF(跨站请求伪造)等攻击。应用可能会使用防篡改的令牌、编码输入数据、设置CSP(内容安全策略)等手段来提高安全性。 总结,...

Global site tag (gtag.js) - Google Analytics