Welcome 微信登录

首页 / 软件开发 / JAVA / Rails开发细节(八)Rails应用的安全

Rails开发细节(八)Rails应用的安全2013-12-11看过本文之后,你应该熟悉下面的内容:

所有显著的对策。

rails中session的概念,其中存放的内容,常见的攻击手段。

rails中大量的分配问题。

在提供管理接口的时候,你不得不关注的一些事情。

如何管理用户:登陆,退出,在各个层面的攻击方法。

常见的注入攻击方法。

1.简介

web框架帮助开发者构建web应用。它们中的一些还可以帮助你构建安全的web应用。事实上一个框架并不比两一个框架安全,如果你正确的使用,你可以用很多框架构建安全的web应用。rails包含一些聪明的帮助工具,例如防止注入攻击的工具,因此这几乎不是什么问题。高兴的是,我审计过的很多rails应用都有一个很好的安全级别。

通常来说,没有即插即用的安全。安全依赖于使用框架的人,有时候是开发的方法。它依赖于web应用环境的所有层:后端存储,web服务器,web应用本身(甚至可能是其它层或者其他应用)。

Gartner Group估计大约75%的攻击发生在web应用层,发现在审计的300个站点中,97%是容易受到攻击的。这是因为相对来说,web应用更容易攻击,因为它们容易理解和操作,设置非专业人士都可以理解和操作。

web应用的威胁包括用户账户劫持,绕开访问控制,读写敏感数据,显示欺骗信息。甚至一个攻击者还可能会安装木马程序,或者是一个主动的电子邮件发送软件,目标是金融数据,或者是通过修改公司的资源来破坏品牌。为了阻止攻击,最小化攻击的影响,移除攻击点,首先要做的是,你需要完全理解攻击的方法,才可以找到正确的对策。这就是本文的目的。

为了开发安全的web应用,你不得不保持各层的更新,并且了解你的敌人。订阅安全邮件列表,保持最新的信息,阅读安全类的博客。我是通过手动完成的,因为那就是你如何发现下流的逻辑安全问题。

2.sessions

开始了解安全的一个好地方就是session,很容易受到特殊攻击的地方。

2.1.什么是session

http是一个无状态的协议,session使得它有了状态。

大多数应用需要跟踪特定用户的状态。这可能是购物车中的内容,或者是一个登陆用户的userid。如果没有session,用户需要在每次请求进行识别和验证。在新用户访问应用的时候,rails会自定创建新的session。如果用户已经使用了应用,会加载一个已经存在的session。

session由一个哈希值和一个sessionid组成,sessionid通常是一个32个字符的哈希字符串。每个发送到客户端浏览器的cookie都包含sessionid。浏览器在客户端的每个请求中会将sessionid发送回来。在rails中你可以通过下面的代码保存和获取session值。

session[:user_id] = @current_user.id User.find(session[:user_id])
2.2.session id

sessionid是一个32字节的md5哈希值。

sessionid由随机字符串的哈希值组成。随机字符串包括当前时间,0-1之间的随机数,ruby解释器的进程id(也是一个随机数字),一个常量字符串。当目前为止,暴利攻击rails的sessionid是不可行的。MD5是不可逆的,但是可以碰撞,因此创建一个相同哈希值的字符串只是存在理论的可能性。

2.3session劫持

偷了一个用户的sessionid之后,一个攻击者就可以用受害者的名义访问web应用。

很多web应用都有验证系统:用户提供登陆账号和登录密码,web应用验证这些信息,验证通过之后,将用户的id保存到session中。在这之后,这个session就是有效的了。每次请求都会加载用户,通过session中的用户id识别用户,不需要再次验证。在cookie的sessionid用来识别session。

因此,cookie为web应用提供了临时的验证功能。每个从某个人哪里获取cookie的用户,可以以那个人的名义使用web应用,可能会产生严重的后果。下面是一些劫持session的方法,已经相应的对策。

在不安全的网络中嗅探cookie。无线局域网就是这样一个网络环境。在一个非加密的无线局域网,尤其容易监听所有连接客户端的通信。这就是为什么不要再咖啡店工作的原因。web应用的构建者应该通过SSL来提供一个安全的连接。在Rails3.1以及后续版本,可以在配置文件中进行配置,来强迫在应用中使用SSL连接。

config.force_ssl = true

大多数的人在公共终端工作之后,没有清除cookie。如果刚才的用户没有退出web应用,你就可以以刚才那个用户的身份使用web应用。在web应用中给用户提供一个log-out按钮,并且放在显著的位置。

很多跨站点攻击脚本cross-site scripting(XSS)的目标就是获取用户的cookie。

不是偷一个对攻击者来说未知的cookie,而是将用户的session的身份(在cookie中)修改为他可以认识的。在后面会讲到这个所谓的session固定。

大多数攻击者的主要目的是获取金钱。偷一个银行账号的私下价格是10-1000美元,获取信用卡号是0.4-20美元,拍卖网站的账户是1-8美元,电子邮件密码是4-30美元。

2.4.session指南

下面是一些常用的session指南

不要再session中存储大对象。将内容存储到数据库,在session中只保存数据的id。这可以消除同步这个令人头痛的问题,还不会占满session的存储空间(这依赖于你选择存储session的类型)。服务端的session存储空间你可以清除session,但是很难减轻客户端的存储空间压力。

关键的数据不应该存储在session中。如果用户清除了他的cookie,或者是关闭了浏览器,这些信息就会消失。在客户端的session存储,用户可以读取数据。