使用session [:user_id]进行Rails身份验证的安全性

Sam*_*erg 4 ruby-on-rails

我注意到很多Rails身份验证教程在session [:user_id]中存储用户ID以记住用户并对其进行身份验证.假设app中有某个地方公开暴露了user_ids(URL,HTML属性上的属性等),这不是不安全的,因为我可以编辑我的会话cookie来使用别人的user_id吗?我在这里错过了什么吗?

Sam*_*erg 9

根据Rails安全指南:"为防止会话哈希篡改,将从具有服务器端密钥的会话计算摘要并将其插入到cookie的末尾."

所以看起来Session可以被认为是安全的,不会被用户篡改(假设我们的服务器端保密是安全的).但是,用户仍然可以读取会话哈希中的任何内容,因此我们不希望存储敏感信息.


Max*_*ams 5

cookie往往不包含user_id,它包含会话密钥,它本质上是一个随机的,无意义的字符串.会话存储在服务器上(在数据库中,或memcached中,或像redis等的nosql存储中),会话保存用户ID.

因此,给定用户的会话记录(仅限服务器端)可能包含以下数据:

key:  asoiuoi09u23uo8789289askho2
user_id: 1234
Run Code Online (Sandbox Code Playgroud)

并且cookie(客户端)持有会话密钥,因此cookie看起来像这样:

name: somecookiename
site: www.yoursite.com
content: asoiuoi09u23uo8789289askho2
Run Code Online (Sandbox Code Playgroud)

因此,要访问其他人的会话,您需要获取其会话密钥.这绝不是不可能的(参见会话嗅探),但使用https(后者又需要SSL证书)会变得更加困难.