Rails 3 ActiveRecordStore session_id篡改

时间:2011-07-07 22:07:42

标签: ruby-on-rails ruby-on-rails-3 security session-cookies tampering

我正在 Rails 3.0.9 中共同开发一个简单的Web应用程序,我意识到可能会通过恶意请求篡改session_id。请注意,这是我的第一个RoR应用程序,因此我的概念可能完全错误。

当前的应用程序功能需要会话,因此我转向ActiveRecordStore会话存储,installed并开始在原始工作流程中进行测试。我注意到Rails框架创建了名为_session_id的cookie和一些随机类似哈希的字符串的值(在DB SESSION表中,此字符串对应于session_id列)。

如果更改了cookie中的值,例如使用Firebug,当前会话ID将更改为随cookie提供的数据(使用request.session_options[:id]检查),并且更改将传播到数据库表,从而创建新会话用上述参数记录。

虽然这不会对会话的变量产生任何影响,但会话ID已经偏离了其通常的类似哈希的外观,而是被用户篡改了。

这是一个问题 - 如何检测或最好阻止这种行为?

1 个答案:

答案 0 :(得分:5)

要回答您的问题,了解如何生成会话ID的机制非常重要。 (来自docs

  
    

会话ID由随机字符串的哈希值组成。随机字符串是当前时间,0到1之间的随机数,Ruby解释器的进程ID号(也基本上是随机数)和常量字符串。目前,暴力破解Rails的会话ID是不可行的。到目前为止,MD5并没有受到影响,但是存在冲突,因此理论上可以创建具有相同散列值的另一个输入文本。但到目前为止,这没有任何安全影响。

  

因此,会话ID被设计为加密“难以猜测”。攻击者可以更改session_id,但他们的想法是他们永远无法猜出有效的会话。

  
    

如何防止这种情况?

  

基于上述逻辑,如果您降低会话到期时间,则会有相当少的“实时”session_id。因此,攻击者更难以随机选择可用的ID。

  
    

如何检测此行为?

  

最简单的方法是使用无效(未过期)会话ID记录所有请求。如果您看到大量此类请求涌入,则有人可能会尝试获取不属于他们自己的会话。