在Ruby on Rails中,使用User.find_by_id(session [:user_id])来识别用户有多安全?

时间:2011-02-25 00:00:08

标签: ruby-on-rails devise authlogic restful-authentication

例如,Rails Restful Authentication使用

User.find_by_id(session[:user_id])

找到用户作为第一次尝试。所以

  1. 如果会话仅通过使用cookie存储(这不是一个只使用cookie存储会话信息的Rails选项吗?),那么用户ID为12345的用户不能 将他的cookie的值从12345更改为12346并伪装成另一个用户?

  2. 作为附注

    予。如果会话是作为cookie的session_id,并在数据库中查找会话信息,那么另一个人不能窃取cookie并伪装成该用户吗? (通过截取互联网流量窃取cookie)

    II。或者,由于第三种选择是使用cookie auth_token来检查字段remember_token的users表,另一个人是否可以窃取    这个auth_token cookie假装是那个用户?

3 个答案:

答案 0 :(得分:3)

Ruby on Rails Security Guide.必须阅读Cookie保密,会话劫持以及更多内容。

答案 1 :(得分:1)

从jdl的回答中,有一些段落:

  

客户端可以看到您在会话中存储的所有内容,因为它以明文形式存储(实际上是Base64编码的,因此未加密)。所以,当然,你不想在这里存储任何秘密。为防止会话哈希篡改,将从具有服务器端密钥的会话计算摘要并将其插入到cookie的末尾。

     

这意味着此存储的安全性取决于此秘密(以及摘要算法,默认为SHA512,尚未泄露)。所以不要使用琐碎的秘密,即字典中的单词,或短于30个字符的单词。把秘密放在你的环境中.rb:

 config.action_dispatch.session = {
  :key    => '_app_session',
  :secret => '0x0dkfj3927dkc7djdh36rkckdfzsg...'
}

注意:我不确定它是config.action_dispatch.session还是config.action_controller.session,或者Rails 3.0.1建议:DEPRECATION警告:config.action_controller.session已被弃用。请改用Rails.application.config.session_store

答案 2 :(得分:0)

这不可能发生,因为会话只引用存储在服务器上的cookie。存储在用户浏览器上的唯一内容是一个id,然后用于从服务器上获取会话。因此,除非他们能够获得会话的加密,否则用户将无法系统地猜测我刚刚解释过的原因。

更新

更改默认值以将会话存储在服务器而不是cookie