从头开始验证 - Cookie被篡改的安全性如何?

时间:2013-02-14 15:03:33

标签: ruby-on-rails ruby-on-rails-3 authentication omniauth

尝试使用Omniauth从头开始进行身份验证。

我跟随瑞恩贝特的screencast。但在我推出实施之前,我想了解一些事情。

在他的截屏视频中,他在helper_method中有一个application_controller

helper_method :current_user

private

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

上面的代码,检查user_id

我知道sessions are encrypted(并存储在Cookie中)。但是,它们是可读的,但无法修改。有人用假user_id劫持会话有多难?什么阻止任何人从头开始创建cookie或通过一些" cookie注入器"方法(如果存在这样的事情)。

我试图了解这些Cookie是如何受到保护的。

2 个答案:

答案 0 :(得分:3)

会话通常保留在服务器端,通过cookie传递给客户端/从客户端传递的唯一内容是会话标识符。将实际会话数据存储在该cookie中将是一个主要的安全漏洞,无论其加密程度如何。例如如果你便宜并且使用了rot-13"加密",那么用户操作数据并设置superuser=1是微不足道的。

但是使用会话ID,这是不可能的 - 在cookie中没有什么可以用来摆弄服务器端数据。他们最多可以发回随机会话ID值,并试图劫持其他人的会话。使用足够大的ID哈希,找到另一个劫持会话的机会很小。

答案 1 :(得分:1)

我认为,您提供的链接可以提供最佳答案。并且涵盖了许多更为隐蔽的攻击,我更关注敏感应用程序。

在Rails中,提交包含会话数据的伪造或伪装的cookie非常困难,因为cookie由服务器签名并且检查提交的cookie以确保签名正确。更改cookie值需要知道服务器使用cookie签名的密钥。

最佳做法是仅在会话中存储非常小的位(最好是ID),如果您担心有人能够从头开始创建包含用户ID的会话cookie,那么简单的答案是:不要把user.id放在cookie中。而是为每个用户生成一个GUID,用作cookie中的id。通过这种方式,您可以在URL中公开user.id,而无需担心知道某个用户的ID将允许攻击者伪造一个有用的cookie。