【发布时间】:2014-05-20 08:37:10
【问题描述】:
如果我只是将provider 和uid 存储在cookie 中是否足够安全?或者我应该加密其中一个或两个?我应该使用安全令牌增加provider 和uid 吗?
还有其他需要考虑的因素吗?
【问题讨论】:
标签: ruby-on-rails oauth omniauth remember-me
如果我只是将provider 和uid 存储在cookie 中是否足够安全?或者我应该加密其中一个或两个?我应该使用安全令牌增加provider 和uid 吗?
还有其他需要考虑的因素吗?
【问题讨论】:
标签: ruby-on-rails oauth omniauth remember-me
您可以使用signed cookie。这些是加密签名的,因此无法在不使其无效的情况下更改其数据。这种 cookie 通常用于存储 Rails 会话 ID/内容。
请记住,这些 cookie 仍然可以被解码(它只是 base64),但这应该不是问题,因为 provider 和 uid 不需要保密。
如果您不希望 cookie 的内容可读,可以使用encrypted cookie。
您可以在ActionDispatch::Cookies documentation 中阅读有关 Rails 提出的不同类型 cookie 的更多信息
【讨论】:
如果您已将您从omniauth 获得的provider 和uid 值存储在cookie 中,则您表示可以在用户访问您的网站时为其登录。这样做的问题在于它作为一种身份验证的手段并不可靠。您想实际验证您网站的用户吗?然后,您需要的不仅仅是可以让您从数据库中检索唯一用户 ID 的数据,正如您所认识到的那样。您需要某种形式的保证,即您与会话关联的用户 ID 代表您认为的用户。
“记住我”本质上依赖于用户代理(例如浏览器)仅由您最初认证的用户使用的假设。您或您的用户可以确定吗? (这就是网站要求您选择“记住我”的原因 - 当您选中该框时,您承诺没有授权访问您的用户帐户的任何人都无法访问您的用户代理。)这不是很难看出这基本上是不安全的。您可以签署或加密您的 cookie,但除非您知道用户代理只能由您认证的用户访问,否则您不知道下次访问您网站的用户有权访问原始用户的帐户。
如果您使用omniauth,那么您实际上是在依赖某个第 3 方来为您验证您的用户,或者作为OpenID Connect 规范中定义的依赖方,或者使用某种非-OAuth 1 或 2 之上的标准身份验证方案。您实质上要问的是“我能否通过第 3 方仅一次安全地对用户进行身份验证,然后安全地假设任何时候同一用户-代理访问我的网站,是同一个用户吗?”
答案是否。
但诚然,安全性和可用性之间存在权衡,有些人可能会认为风险(如果用户的帐户不是那么敏感)被可用性优势所抵消。但是,如果您依赖第 3 方提供商来验证您的用户,那么可用性差异几乎是零。如果用户已经在 google、facebook 或任何其他提供商上授权了您的应用程序,并且如果他们与该提供商有当前会话,那么当他们单击您网站上的“使用 [provider] 登录”链接时,他们可以在没有来自用户的额外交互的情况下登录。无需记住和输入密码或用户名,什么都没有。所以可能发生的最糟糕的情况是他们必须登录谷歌、Facebook 或其他任何东西,如果他们还没有登录的话。
此外,如果您这样做,您将获得更多的保证,即用户就是他们所说的那个人。每次您的用户使用 OpenID 提供商“登录”时,您都会获得一个 id 令牌,说明他们是谁、他们由提供商进行了身份验证、该身份验证事件何时发生等。所以您不仅仅是 假设他们是具有特定提供者 uid 的用户,您信任提供者断言他们是。当然,即使这样也不是完全安全的,因为用户的提供商帐户可能会被盗用,或者从理论上讲,提供商可能是不可信的。但这仍然比“记住我”有所改进。
TL;DR “记住我”本质上是不安全的,并且与每次访问都需要通过 OpenID 提供商登录相比,并没有提供有意义的可用性改进。不要这样做。
【讨论】: