Rails开发细节(八)Rails应用的安全

看过本文之后,你应该熟悉下面的内容:

所有显著的对策。

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存储,用户可以读取数据。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索应用
, session
, 哈希
, 用户
, 攻击
, 一个
, 10语音识别框架
, session安全
, 获取session值
哈希表碰撞攻击
rails api开发、rails 微信开发、rails开发工具、rails为什么开发快、rails 可视化开发,以便于您获取更多的相关知识。

时间: 2024-09-02 07:23:02

Rails开发细节(八)Rails应用的安全的相关文章

Rails开发细节(九)Rails的测试

1.为什么写测试 rails使得我们很容易就可以写测试.在创建model和controller的时候,rails帮助我们创建了测试的骨架代码. 通过简单的运行你的测试代码,你可以确保你的代码在重构之后任然满足需求的功能. rails测试可以模拟浏览器请求,这样你就可以在不适用浏览器的情况下测试应用的响应情况. 2.测试简介 因为每一个rails应用都会和数据库有大量的交互,因此你的测试也需要一个数据库来进行交互.为了更好的写测试,你需要知道如何建立数据库,以及加载样本数据. 2.1.三个环境 每

Rails开发细节(二)CRUD

Create & Save 创建 & 保存 order = Order.new order.name = "virusswb" order.email = "asdf@exmaple.com" order.save 调用save方法之后就可以保存到数据库了. 还可以用block来创建并保存. Order.new do |order| order.name = "virusswb" order.email = "asdf@

Rails开发细节(一)

常用命令 rails new new_app cd new_app rake db:create rails server rails generate controller Blog action1 action2 rails generate scaffold Product title:string description:text rails generate model Comment commenter:string body:text post:references rake db

Rails开发细节(五)Migrations 数据迁移

1.简介 在rails中用migration可以很方便的管理数据库的结构.可以创建数据库,创建表,删除表,添加字段,删除字段,整理数据. migration就是一系列的class,这些类都继承了ActiveRecord::Migration类. class CreateProducts < ActiveRecord::Migration def up create_table :products do |t| t.string :name t.column :description, :text

Rails开发细节(四)Transactions事务

事务在数据库应用开发中是相当重要的,尤其是在关系数据库中.典型的例子就是银行在转账,在两个账 户之间转账. account1.deposite(100) account2.withdraw(100) 在ActiveRecord中使用transaction方法执行一段block来实现事务.在 block的最后,会提交事务,更新数据库,如果在block中发生异常,数据库会回滚所有改变. Account.transaction do account1.deposite(100) account2.wi

Rails开发细节(七)ActiveRecord Associations关联

1.为什么需要关联 很多时候,比如说电子商务中的用户和订单,一个用户会有很多的订单,一个订单只属于一个用户,这就是一种关联. 在创建订单的时候需要用户主键作为外键,删除用户的的同时需要删除用户的订单. 在rails中可以向下面这样订单关联. class Customer < ActiveRecord::Base has_many :orders, :dependent => :destroy end class Order < ActiveRecord::Base belongs_to

Rails开发细节(三)Participating in the Monitoring Process

Participating in the Monitoring Process 参与监控过程 ActiveRecord控制着model对象 的生命周期,它创建它们,在修改,保存和更新的时候监控它们,并且在删除的时候也进行监控.使用回调函 数,ActiveRecord允许我们的代码参与这个监控过程. ActiveRecord总共定义了20个回调函数.18个 成对的before和after,还有两个例外:after_find和after_initialize. 开发细节(三)Participatin

Rails开发细节(六)ActiveRecord Validationa and Callbacks验证和回调

1.对象生命周期 通常情况下,在rails应用中,对象会被创建,修改和删除.ActiveRecord针对这些对象提供了拦截,你可以控制你的应用和这些对象. 验证保证了存入数据库的数据都是有效的.回调和观察者允许你在对象状态发生变化的前后进行一些逻辑操作. 2.验证 2.1.为什么需要验证 验证保证了只有合法的数据才可以存入数据库.例如,你的应用需要确保每个用户都拥有合法的电子邮件地址和邮寄地址. 在存入数据库之前,有很多方法可以验证数据的合法性.包括数据库约束,客户端的验证,controller

Ruby on rails开发从头来(五十八)- ActiveRecord基础(自关联)

或许存在这样的情况,在一个表中,一条记录关联到表中的另一条记录,例如,公司中的每个雇员都有上级和下级,而他们同时又是雇员,在Rails中你可以这样使用Employee类: class Employee < ActiveRecord::Base belongs_to :manager, :class_name => "Employee", :foreign_key => "manager_id" belongs_to :mentor, :class_