Rails 3 ActiveRecordStore session_id篡改

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

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

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

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

这是一个问题 – 如何检测或优先防止这种行为?

要回答您的问题,了解session-id生成方式的机制非常重要。 (来自文档 )

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

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

如何防止这种情况?

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

如何检测到这种行为?

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