`

关于rails处理跨站点攻击

阅读更多

首先声明,本文纯属转载,链接地址:http://2015.iteye.com/blog/604377,处于对作者的尊重,将地址放到这里,本文之所以转载是因为本人认为该文章写的非常好,并达到时刻为自己的知识做储备和扩大知识范围,希望更多的朋友能够看到这篇文章,好的,下面,正文开始:

 

一、什么是CSRF
先看看CSRF的原文说明,如下:
Cross Site Reference Forgery works by including malicious code or a link in a page that accesses a web application that the user is believed to have authenticated. If the session for that web application has not timed out, an attacker may execute unauthorized commands.

 

二、CSRF案例说明和分析
自然,这里拿Rails程序来举例子说明这些问题,大家知道Rails2之 前是把session放在服务器端(文件或者DB或者缓存中),客户端在cookie中保存sessionid;而到了Rails2后,还有一种方式是把 session放在基于cookie的客户端中。当然这两样都各有道理,各有优劣。当我们向一个域名发送一个请求的时候,如果存在这个域名的 cookie,浏览器会自动把cookie附带上。这样本来没有啥问题,也是我们为了解决http无状态记录的解决方案,但是有个问题出现了,如果出现一 个到其他域名的请求,浏览器在加载的时候,也把cookie给带上了,会有什么问题?我们举个简单的也很常见的例子来说明这个问题。
1、Bob在自己的电脑上刚刚查看完自己的银行A账户余额,然后比较无聊就跑到一个公开的BBS上灌水,当他看到一篇“银行A的内部照片”的帖子,很有兴趣的打开这个帖子想看看自己信任的银行A的内部图片是啥样子的,殊不知,这其实是一个attacker精心设计的骗局。
2、在这个帖子中确实有几个图片,看上去真的像是银行A的照片,但是其中有个图片没显示出来,Bob以为是自己网速太慢,导致这个图片没有加载进来,也没在意。只是对这些并不是十分满意的照片摇摇头,就关了这个帖子。
3、几天后,Bob猛然发现自己在银行A的账户上少了1000元,到底是怎么了?
分析:
为什么钱少了呢?我们得分析一下上面这个案例,还记得当时Bob说有个图片没显示么,是的,我们来看看这个图片的地址,惊奇的发现是:<img .src="http://www.banka.com/transfer?account=myself&amount=1000&destination=attacker ">,这是一个什么地址?聪明的您一定很快就能明白,这个地址是邪恶的,看上去,他的意思是打开这个地址的人,给attacker转了1000元。
这 怎么可能?你肯定急了,我怎么能随便给一个人转1000元呢,而且我都不知道呀!但是,注意了,这其实是完全有可能的。还记得当时Bob刚刚查看完帐号信 息,基于银行A的cookie并不过期,当出现如上链接出现在src的时候(note that .src is meant to be src),浏览器尝试着按照本地的cookie去加载上面这个URL,而银行A验证了来源请求的cookie是可以的,所以就这样事情就悄悄的发生了。
ok, 看明白了么,这就是CSRF,一句话给他下个定义就是:借你的cookie在你不知道的时候悄悄的做了一些你不愿意做的事情。这里有个更要命的是,这个包 含上述URL的图片或者链接,并不需要一定是放在银行A的服务器上,相反可以在任一地方,比如blog,公开的BBS,或者一些群发的Mail中等等,如 此多的场合下,这些都有可能存在陷阱。

 

三、CSRF的预防
看上去很恐怖吧,是的,确实恐怖,意识到恐怖是个好事情,这样会促使你接着往下看如何改进和防止类似的漏洞出现。
总体来说,预防CSRF主要从2个方面入手,分别是:
1、正确使用GET,POST和Cookie;
2、在non-GET请求中使用Security token;

一般,大家知道的浏览器发送请求的方式有GET或者POST,但是还有一种比较常用的是Cookie,至于其他的HTTP协议请求方式,你可以google,一般按照W3C的规范:
1、GET常用在查看,列举,展示的时候;
2、POST常用在下达订单,改变一个资源的属性或者做其他一些事情;

ok,我们这里拿Rails按照前面列举的2种预防手段做说明,首先,我们可以在Rails的控制器中(controller)将一些方法(action)限定(verify)为只能使用POST或者GET,例如:

Ruby代码  收藏代码
  1. verify  :method  =>  :post :only  => [  :transfer  ],  :redirect_to  => {  :action  =>  :list  }   
verify :method => :post, :only => [ :transfer ], :redirect_to => { :action => :list } 

 

恩,很好,这样做下限制以后,前面案例中的方法就失效了,因为这里我们限定了transfer必须使用POST来提交请求,当GET请求来的时候并不会被响应。
万事大吉了?NO!因为POST的请求也是可以被构造出来后自动发送的,如何实现,看下面吧,你肯定会吃惊的。

Html代码  收藏代码
  1. < a   .href = "http://www.1sters.com/"   onclick = "var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = 'http://www.example.com/account/destroy'; f.submit();return false;" > 点我试试 </ a >    
<a .href="http://www.1sters.com/" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = 'http://www.example.com/account/destroy'; f.submit();return false;">点我试试</a> 

 

是的,这就是一个活生生的例子(.href is meant to be href),使用link的href或者img的src都可以,再想想一个Attacher放了一个图片,然后写了一个onmouseover方法,执行上述的那段JS,如下,或者使用AJAX。

Html代码  收藏代码
  1. < img   .src = "http://www.harmless.com/img"   width = "400"   height = "400"   onmouseover = "…"   />   
<img .src="http://www.harmless.com/img" width="400" height="400" onmouseover="…" />

 

所以,限定为POST后还不是非常的保险,怎么办?不急,我们还有第二步,给non-GET的请求设置security token,如何实现,在Rails2以后非常简单(也是默认的),我们只需要在environment.rb中添加如下代码:

Ruby代码  收藏代码
  1. config.action_controller.session = {     
  2.   :session_key  =>  '_csrf_session' ,     
  3.   :secret       =>  'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a'      
  4. }  
config.action_controller.session = {   
  :session_key => '_csrf_session',   
  :secret      => 'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a'   
}

 然后在application controller中包含如下security token设置:

Ruby代码  收藏代码
  1. protect_from_forgery   :secret  =>  'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a'    
protect_from_forgery  :secret => 'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a' 

 

ok,基本上安全了,如果这时POST请求过去,但是security token和session计算出来的secret和服务端的secret匹配不上的话,就会返回一个 ActionController::InvalidAuthenticityToken错误,防止该类缺陷的出现。
安全了,也许你要说,那我如果能破解出protect_from_forgery,不就OK了么,按照理论上是,但是实际破解是基本上不可能的,因为有人曾计算过,暴力破解该串大概需要2的11次方时间。

分享到:
评论

相关推荐

    Apress.Practical.Rails.Social.Networking.Sites.Jun.2007.eBook-BBL.pdf

    ### 实践Rails社交网络站点开发知识点总结 #### 一、书籍基本信息 - **书名**:《实践Rails社交网络站点》 - **作者**:Alan Bradburne - **出版年份**:2007年 - **出版社**:Apress - **ISBN-13(pbk)**:978-1-...

    rails-security-audit:Rails安全审核清单

    Rails安全审核列表 0.安全宝 用于Ruby on Rails应用程序的静态分析安全漏洞扫描程序 -机架中间件,用于阻止和限制 与安全性相关的标头全部包含在一...2.跨站点脚本 确保始终防止XSS攻击。 检查代码中是否有任何html_s

    appdev.academy:Ruby on Rails后端的https

    在Rails中,可以使用`rack-cors` gem来处理这个问题。 6. **浏览器兼容性**:确保你的应用支持所有现代浏览器的TLS版本,因为某些旧版本的浏览器可能不支持最新的加密套件。 7. **HSTS(严格传输安全)**:启用...

    存储XSS1

    4. **流量劫持**:攻击者可重定向用户到其他恶意网站,比如赌博、色情站点,或者用于分布式拒绝服务(DDoS)攻击的网站。 **三、防范措施** 1. **输入验证**:对用户提交的数据进行严格的过滤和验证,避免特殊字符...

    一份关于后端开发框架的大纲教程!!!!!

    - **CSRF**:通过验证令牌等方式防止跨站点请求伪造攻击。 ### 部署和扩展 #### 二十二、部署到生产环境的步骤 - **环境准备**:确保生产环境符合部署要求。 - **构建过程**:打包应用程序及其依赖项。 - **发布...

    BLOG系统

    12. **安全性**:考虑XSS(跨站脚本攻击)、CSRF(跨站请求伪造)和SQL注入等常见Web攻击,需采取相应的防护措施,例如使用参数化查询、输入验证和HTTPS加密通信。 13. **性能优化**:通过缓存策略、CDN(内容分发...

    apps.fyne.io:可用的Fyne应用程序的中央列表站点

    开发者可以通过分析源代码学习如何处理用户输入、防止SQL注入、XSS攻击,并确保敏感信息的安全。 通过研究"apps.fyne.io-master"的源代码,开发者不仅可以学习如何构建类似的应用展示平台,还可以加深对Ruby on ...

    视频博客源码

    源码应包含必要的安全措施,如防止SQL注入、XSS攻击、CSRF(跨站请求伪造)等。可能还集成了防火墙规则、DDoS防护和安全日志监控。 9. **部署与配置**: 用户快速搭建视频博客平台,意味着源码应提供清晰的部署...

    andreacavagna01.github.io:测试github页面

    10. **安全实践**:GitHub Pages项目通常遵循安全最佳实践,例如使用HTTPS以加密数据传输,避免XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等常见的Web安全问题。 综上所述, andreacavagna01.github.io 项目涉及了...

    yourmailproject:官方站点Your Mail项目

    6. **安全**:考虑到电子邮件的敏感性,项目必须实现HTTPS加密、CSRF(跨站请求伪造)防护、XSS(跨站脚本攻击)过滤等安全措施。 7. **测试**:项目可能包含单元测试、集成测试和端到端测试,以确保代码质量和功能...

    redmine-2.6.3

    通过深入了解和使用 Redmine 2.6.3,团队能够更有效地管理项目,提高工作效率,实现跨部门、跨地域的高效协同。同时,由于 Redmine 是开源软件,用户可以根据自身需求进行二次开发和定制,以满足特定业务场景。

    fati-shop.business.site

    - 输入验证防止SQL注入和跨站脚本攻击。 - 用户密码应经过哈希处理并加盐存储。 6. **SEO优化**: - Meta标签设置以提高搜索引擎可见性。 - 网站速度优化,减少加载时间。 - 结构化数据标记,利于搜索引擎理解...

    Tech-Blog-Site2

    - **CSRF(跨站请求伪造)和XSS(跨站脚本攻击)防护**:通过设置cookie的SameSite属性,以及验证请求头的CSRF令牌,防止这类攻击。 - **输入验证**:对用户提交的数据进行验证,防止SQL注入等安全问题。 7. **...

    andrewbakeruk_blog

    9. **安全考虑**:考虑到网络安全,项目可能使用HTTPS加密,以及防止SQL注入和跨站脚本攻击的安全措施。 10. **性能优化**:可能采用了CDN(内容分发网络)加速静态资源加载,或者使用Gzip压缩、HTTP缓存策略来提升...

    my-site

    7. **部署和托管**:"my-site"可能部署在云服务提供商如AWS、Google Cloud或Heroku上,也可能使用静态站点托管服务如Netlify或GitHub Pages。 8. **测试和调试**:开发者会用到单元测试(如Jest、Mocha)、集成测试...

    PersonalWebsite

    9. **安全考虑**:确保网站的安全性至关重要,包括防止XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等,以及使用HTTPS协议保障数据传输的安全。 10. **持续维护与更新**:网站上线后,定期更新内容、修复漏洞、优化...

    MonPorteFolio

    2. **编程语言**:项目可能使用了各种编程语言,如JavaScript(前端开发)、Python(后端或数据处理)、Java(跨平台应用)或C++(高性能计算)。选择哪种语言取决于项目的目标和开发者的技术栈。 3. **前端技术**...

Global site tag (gtag.js) - Google Analytics