Ruby on rails 用户Id会话安全吗?哈特尔

Ruby on rails 用户Id会话安全吗?哈特尔,ruby-on-rails,session,cookies,Ruby On Rails,Session,Cookies,在Hartl的教程中,我们将会话设置为一个cookie,该cookie存储为用户id的散列版本。然后,我们将未散列的cookie与user.id进行比较 这安全吗?难道我不能通过会话散列随机用户id号来生成一个cookie,然后我可以用它作为另一个随机用户登录吗?通常你不想公开user.id。会话的工作方式是会话[:user_id]将创建一个临时cookie并自动加密user.id。这是会话[:user\u id]和cookie[:user\u id]之间的区别之一。然后它将在下一页自动解密。

在Hartl的教程中,我们将会话设置为一个cookie,该cookie存储为用户id的散列版本。然后,我们将未散列的cookie与user.id进行比较


这安全吗?难道我不能通过会话散列随机用户id号来生成一个cookie,然后我可以用它作为另一个随机用户登录吗?

通常你不想公开user.id。会话的工作方式是会话[:user_id]将创建一个临时cookie并自动加密user.id。这是会话[:user\u id]和cookie[:user\u id]之间的区别之一。然后它将在下一页自动解密。因此,从技术上讲,它仍然被认为是安全的。

根据rails的版本,cookie存储区存储的数据要么是经过加密签名的(用户可以看到所有数据,但检测到并拒绝修改),要么是经过签名和加密的(修改仍然被拒绝,但用户无法知道您在会话中存储的内容)。在这两种情况下,如果您篡改会话数据,rails尝试加载会话时会出现异常

您可以通过在控制器中使用
cookies.signed
cookies.encrypted
对常规cookies使用这些保护


用于加密/签名的密钥来自
secret\u key\u base
设置(在rails的最新版本中,这在config/secrets.yml中)。如果攻击者有权访问此设置,则他们可以伪造cookie存储会话数据

Hartl的书只是为教程,你可以自定义它在什么安全你想。所以它是不安全的,我为什么解释是正确的?它是安全的意义上,我正在散列一个数字,但由于基数是非随机的,容易猜测,我们不认为它不安全吗?我们知道:user\u id从1开始并递增。因此,secret\u key\u base在每个rails应用程序中是唯一的。如果我创建两个不同的rails应用程序,我可以预期两个不同的密钥基础加密“代码”。此外,在这个示例中,除了我之外,没有人知道我正在散列user:id。泄露数据库不会让恶意用户知道秘密密钥库或我利用会话的技术。尽管如此,如果数据库被破坏并且没有散列会话列,他们可能会推断出我的会话散列技术。你认为这是对你答案的正确解释吗?它确实是独一无二的。我不会担心如何使用会话的秘密——这只是通过隐晦实现的安全性,没有什么价值。数据库并没有涉及到这么多。
def log_in(user)
    session[:user_id] = user.id
  end