`
fireDragonpzy
  • 浏览: 466617 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

ruby和rails的安全性问题学习

阅读更多
因为在论坛http://www.ruby-lang.org.cn/上有drive2me兄问rails的安全性如何,而我也不是很了解,所以
在网络上学习了一下,下面就是一些总结,一来是帮助drive2me兄,回答他的问题,一来也是备忘,希望有更多人研究rails的安全性,写出更安全的webapp。

1. ruby的安全机制
  参考《programming ruby》中的Locking ruby in safe一章。
  主要说明了安全级别和脏对象。

  脏对象(tainted object):所有外部数据都是危险的,比如对表单提交的数据进行eval操作就会造成很严重的安全问题。

  所有从外部进入的ruby解释器的数据都可以被标记为脏对象(tainted),
  当ruby解释器运行在某一个安全模式下时,有危险的方法调用将导致系统抛出SecurityException.

  变量$SAFE决定ruby的“怀疑级别”。数字越低越不安全。
  $SAFE=0   让ruby不检查外部提供的脏(tainted)数据的使用情况,这是ruby的默认模式。
  $SAFE>=1  让ruby不允许脏(tainted)数据使用可能有危险的方法,比如eval。
  $SAFE>=2  让ruby不允许从全局可写位置装载程序。
  $SAFE>=3  让ruby把所有新创建的对象都认为是脏的(tainted).并且不能把一个脏对象untaint.
  $SAFE>=4  让ruby有效地把正在运行的程序划分成两部分,脏的和干净的。

  $SAFE变量一旦设置了一个值,就不可能再设置为更低的值了。
  $SAFE值是线程独立的,新线程会继承当前的$SAFE值,但是新线程可以修改这个值,而其它线程不受影响。
  使用这个机制可以实现一个沙盒,用来运行外部的程序。例如:
   
f=open(filename,"w")
    f.print ...   # write untrusted program into file.
    f.close
    Thread.start do
      $SAFE = 4
      load(filename, true) # wrapp 到一个匿名模块中去。
    end


  创建一个Proc对象时,实际的安全级别被存储在该对象中。如果这个Proc对象是脏的(tainted), 并且
  当前的安全级别大于这个Proc对象的实际安全级别,那么,这个Proc对象是不能被传递给其它方法去使用的。

  脏对象:ruby解释器自动地把任何从外部得到的对象都标记为脏对象(tainted object).比如从环境变量中得到
  的string对象,从文件中读取的string对象等。
  你的程序从脏对象得到的新对象也会被标记为脏对象,比如:
   
y1 = ENV["HOME"]
    y1.tainted?     # => true
   
    y2 = y1[2, 4]
    y2.tainted?     # => true



2. webapp共有的安全问题

  = SQL Injection (SQL注入):
    问题:因为不对来自于外部的数据按照sql的元字符进行转义,比如不对"/","'"等字符进行sql转义,从而
         使得黑客可以改变WHERE子句条件来增删改数据,甚至是执行任意的sql语句。
    如何避免:rails自动处理这些需要转义的字符。如果你自己写了condition, limits, order 那么你必须
    正确转义这些危险的字符。
    例子:
    错误的用法:
Email.find_all "owner_id = 123 AND subject = '#{@params['subject']}'"

    攻击方法:  提供subject的内容为" 'or 1 --' ".
    解决办法:
subject = @params['subject']
              Email.find_all [ "owner_id = 123 AND subject = ?", subject ]

              或者:
Email.find_by_sql "SELECT * FROM email WHERE owner_id = 123 AND subject = #{Email.quote(subject)}"


  = Cross Site Scripting (CSS/XSS) (跨站脚本) :
    浏览器的用户使用cookie来跟踪session,CSS是一种盗取cookie,最后盗取session登录权限的技术。
    cookie只能被创建它的domain访问到。最简单的办法就是放一段恶意javascript在目标网站(要盗取用户权限的网站)
    中,当用户访问目标网站时,打开的页面中会执行恶意javascript代码,因为来自于目标网站,所以恶意代码可以访问
    用户的当前cookie,于是把这些数据放入url参数中传递到攻击者的网站去。
    例子:
    错误的写法:<%= @params['text'] %>
    攻击方法:提交的参数写为 <script>alert(document.cookie)</script>,让受害者打开这个目标网站的受攻击
    页面,从而把受害者的cookie传到攻击者的网站去。
    解决办法:把每个会在页面中显示的语句都进行html转义。用<%=h @params['text'] %>

    用echo服务造成的CSS攻击:因为echo服务会把收到的内容原封不动地返回去,所以攻击者会让受害者打开一个含有
    向目标网站发送带有传递cookie信息的javascript脚本,当浏览器收到echo服务返回的内容时,有些IE会渲染这
    个页面,并执行其中的javascript代码,从而把cookie发送到攻击者的网站去。用于攻击的页面内容如下:
     
<form action="http://target.domain:7/" method="post">
        <input type="hidden" name="code" value="some_javascript_code_here" />
        <input type="submit" />
      </form>

    解决办法:关闭目标服务器上可能造成CSS攻击的echo服务和其它服务(FTP,POP3等)。

    有专门的网站记录CSS攻击事件:http://www.xssed.com/

  = Session hijacking (session 劫持):
  攻击者通过 sniffing 不安全网络,获取别人的cookie.然后使用该cookie登录目标网站。

    解决办法:
    *告诉浏览器传送cookie时使用ssl.
    
 ActionController::Base.session_options[:session_secure] = true

    *登出后销毁session: session[:user_id] = nil
    *登录成功后创建并复制一个新的session.需要复制旧session的所有对象。 用reset_session方法实现。

  = Session fixation (session 固化):
  攻击者设法让受害者使用攻击者已知的一个session identifier(session标识)来进行登录。
  第一步,攻击者创建一个有效的session identifier,rails不接受任意形式的session identifier,而php接受,
  所以攻击者必须要访问目标网站才能攻取到rails产生的session identifier,从这点看rails比php安全。
  第二步,攻击者设法让受害者的浏览器使用这个session identifier去登录,这被称作"真实session固化".
  真实session固化的一个方法是把受害者的网络请求中途截断,然后改写目标网站返回的session identifier.
  等受害者登录网站后,攻击者就可以在受害者退出前使用受害者的登录帐号了。

  解决办法:
  *不在公共页面上创建有效的session. 可以使用controller的sessionff方法关闭所有method的session产生。
  *在成功登录后,创建一个新的session. reset_session.
  *有效地设置cookie的过期时间。

  = Cross-site Request Forgery (跨站请求伪造)
  攻击者设法让受害者打开一个网页,或者打开一封邮件,其中有图片链接,这个链接会让用户向他已经登录的网站发起一个
  请求,来做一些受害者不知道的事情,比如修改密码、下订单、删除数据等等。攻击用的url类似:
  <img  src="http://www.application.com/order/20/delete" />

  解决办法:
  *正确使用GET/POST方法,GET读取数据,POST修改数据。
  *使用CSRF-KILLER插件为请求加上token(令牌).


3. rails自身使用不当造成的安全隐患(mass-assignment problem)
  = 直接用表单创建记录, 也被称作 mass-assignment 问题
  普通的写法:
   
<form method="post" action="http://website.domain/user/register">
      <input type="text" name="user[name]" />
      <input type="text" name="user[password]" />
    </form>

    User.create(@params['user'])
  恶意代码:
   
<form method="post" action="http://website.domain/user/register">
      <input type="text" name="user[name]" />
      <input type="text" name="user[password]" />
      <input type="text" name="user[role]" value="Admin" />
      <input type="text" name="user[approved]" value="1" />
    </form>

  解决办法:
    attr_protected, 加手工赋值, user.approved = sanitize_properly(@params['user']['approved'])
    attr_accessible :name, :password, 让rails默认情况下不让任何属性能够"mass-assignment"除非
      显式地说明该属性可以批量访问(mass-assignment)。

  = rails自身的安全问题:
  http://blog.evanweaver.com/articles/2006/08/12/anatomy-of-an-attack-against-1-1-4/

4. help tools
  safeERB
  csrf-killer

5. 我的结论
  rails提供了很多安全方面的功能,所以开发一个安全的webapp用rails会比其它webapp框架容易。
  webapp面临的大都数安全问题是共有的,并非应用rails而造成的,反而rails提供的很多安全化手段可以让webapp变得
  更加安全。

  当然rails和ruby程序自身也有一些安全隐患,但并不是致命和不可克服的,需要紧跟rails和ruby官方网站发布的安全
  声明。

参考资料:
  <<programming ruby 2nd>> (Table 25.1. Definition of the safe levels)
  http://www.rorsecurity.info/ruby-on-rails-security-cheatsheet/
  http://ianloic.com/insecurity_is_ruby_on_rails_best_practice
  http://www.lonerunners.net/blog/archives/1028-Rails-Security-Secure-your-Ruby-on-Rails-web-application.html
  http://sonjayatandon.com/05-2006/how-to-build-a-secured-web-application-with-ruby-on-rails/
  http://manuals.rubyonrails.com/read/chapter/47
  http://erlend.oftedal.no/blog/?blogid=20
  http://manuals.rubyonrails.com/read/book/8
  http://www.slideshare.net/amiable_indian/ruby-on-rails-security
出处:http://blog.csdn.net/yangbo_hr/article/details/2008183
分享到:
评论

相关推荐

    ruby on rails 101

    ### Ruby on Rails 101:深入理解与实践 ...通过这五天的课程,读者不仅能够系统地学习Ruby on Rails的核心概念和技术,还能了解到一些高级主题。无论是初学者还是有一定经验的开发者,都可以从中受益。

    ruby on rails最新版

    使用最新版可以确保开发者能利用到最前沿的技术,并且通常意味着更好的安全性和社区支持。 描述中的“这是本人精心收集的重要软件”表明这可能是一个包含Rails最新版及其相关工具和库的压缩包,可能是为了方便...

    ruby on rails 3 tutorial.pdf

    此外,你还将接触到Rails的测试驱动开发(TDD)理念,学习如何编写测试用例,确保代码的质量和稳定性。 随着学习的深入,你将探索更高级的主题,如AJAX集成、Caching技术以提升应用性能,以及如何利用gem(Ruby的库...

    ruby on rails 开发环境包(ruby1.8.7,rails2.2.3)

    然而,值得注意的是,随着时间的推移,Ruby和Rails都有了显著的发展,最新的版本提供了更多的特性和安全性改进。如果可能,建议升级到更现代的版本,以利用最新的技术和最佳实践。但是,如果你正在维护一个老项目或...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    #### 九、安全性 - **重要性**:确保Web应用的安全对于保护用户数据至关重要。 - **措施**:Rails提供了多种内置的安全特性,如防止跨站脚本攻击(XSS)、SQL注入等。 #### 十、下一步 - **学习路径**:继续深入...

    Ruby on Rails入门权威经典

    对于更高级的主题,例如部署到服务器、性能优化、安全性和API开发,本书也会提供基础的引导,帮助读者了解实际生产环境下的Rails应用运维。 总的来说,《Ruby on Rails入门权威经典》是一本内容丰富、实践性强的...

    Ruby on Rails 4 Tutorial 中文版

    同时,你会学到如何使用Rails的验证机制来保证数据的完整性和一致性。 在部署方面,Rails 4支持Heroku、Capistrano等工具,让你能够轻松将应用上线到生产环境。此外,还会有关于安全性的讲解,如CSRF(Cross-site ...

    Ruby On Rails教程

    对于部署到互联网服务提供商(ISP)的情况,需要考虑服务器环境的兼容性和安全性问题。 #### 四、快速上手 - **创建新应用:** 使用Rails命令行工具可以快速创建一个新的Rails应用程序。例如,`rails new myapp`命令...

    ruby on rails在线考试系统

    8. 安全性:Rails内置了一些安全特性,如CSRF(跨站请求伪造)防护、XSS(跨站脚本攻击)防护以及参数过滤等。在考试系统中,确保考试的公正性和数据的安全至关重要。 9. 布署与服务器配置:Rails应用通常部署在如...

    ruby on rails社区网站开发源码

    在“ruby on rails社区网站开发源码”中,我们可以学习到如何利用Rails构建一个互动性强、功能丰富的社区网站。以下是一些关键知识点: 1. **安装与环境设置**:首先,你需要安装Ruby和Rails。这通常涉及设置Ruby...

    Ruby on Rails 指南 v5.0.1 中文版

    - **结论**:总结Rails国际化的重要性和最佳实践。 - **为Rails I18n作贡献**:鼓励社区成员为Rails的国际化功能贡献力量。 - **资源**:列出相关的资源链接。 - **作者**:列出指南的作者和贡献者。 #### ...

    ruby on rails 搭建redmine

    11. **优化与安全**:为了提升性能和安全性,可以考虑使用如Nginx或Apache作为反向代理,启用HTTPS加密通信,以及定期更新Redmine和其依赖以修复潜在的安全漏洞。 12. **插件与定制**:Redmine有丰富的第三方插件,...

    ruby_on_rails 源代码上

    Ruby on Rails,简称Rails,是基于Ruby...以上只是Ruby on Rails的部分基础知识,实际开发中还会涉及到更多如缓存、部署、安全性、性能优化等方面的知识。通过深入学习和实践,你可以更好地掌握这个强大的Web开发框架。

    Ruby和Rails高效的Kafka处理框架_Ruby_下载.zip

    无论是处理大规模的日志数据,还是实现实时用户行为分析,这种组合都能在保证可靠性和效率的同时,降低开发复杂度。通过深入理解和实践这些工具,开发者可以提升自己的技能,更好地应对现代Web应用面临的挑战。

    Ruby on Rails 入门经典教程

    在实际项目开发中,安全性和性能优化是重要的话题。教程将讲解如何使用Rails的安全特性,如防止跨站脚本攻击(XSS)和SQL注入,以及如何优化数据库查询和缓存策略来提升应用性能。 最后,教程还会涉及Rails社区常用...

    Ruby for Rails中文版,完整扫描版

    12. 安全性:安全性是Web开发中的一个重要方面,本书可能会讨论Rails应用中的安全实践,包括输入验证、防止XSS攻击和CSRF保护等。 综上所述,本书是为想要学习Ruby和深化Rails知识的开发者提供的一个全面教程。它...

    Ruby.on.Rails.Enterprise.Application.Development

    ### Ruby on Rails企业应用开发详解 #### 一、引言 《Ruby on Rails Enterprise Application Development》这本书由...通过学习本书,你可以更好地理解和掌握Ruby on Rails在构建复杂企业级应用方面的优势和技巧。

    Ruby-Mutations用于编写安全可重用和可维护的代码Ruby和Rails应用程序

    Ruby-Mutations是一个强大的工具,专为Ruby和Rails开发者设计,旨在提高代码的质量和可靠性。它通过执行一系列针对代码库的“突变测试”来确保你的测试套件具有足够的覆盖率,从而帮助你编写出更安全、可重用和可...

Global site tag (gtag.js) - Google Analytics