2013-02-14 37 views
3

我正尝试使用Omniauth从头开始进行身份验证。从头开始验证 - cookies被篡改有多安全?

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

在他的截屏,他在application_controller一个helper_method:以上

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是如何被保护的。

回答

3

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

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

+0

感谢您的好解释。所以当创建会话时,会话标识符与服务器端存储的会话标识符相关联。会话标识符用于验证会话是否是真实的。但是,如果有人使用确切的会话标识符和伪造的user_id创建假cookie,该怎么办?这不会证实通过? – 2013-02-14 15:12:49

+1

除了这不是Rails默认的行为方式。您需要切换到ActiveRecord会话存储以获取此行为。 – 2013-02-14 15:14:11

+0

典型的会话cookie基本上只是'nameOfSession = long_ugly_alphanumeric_string'。没有用户名/密码/那里的数据。 JUST该字符串,用于告诉服务器会话激活时加载哪个会话文件/数据库记录/任何内容。这就是整个“猜测”业务进入的地方。如果散列长度足够短/简单(例如简单递增整数),那么只需将会话cookie更改为其他人的会话ID就可以劫持会话。但是如果哈希值足够复杂,那是不太可能的。 – 2013-02-14 15:15:18

1

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

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

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

+0

很好的解释 – 2013-02-18 03:44:49