如何在PHP中安全地存储包含敏感数据的cookie?

时间:2012-08-05 06:05:12

标签: php security cookies login hash

我希望我的用户在登录我的网站时能够“保持登录状态”。根据这篇文章的最高答案"Keep Me Logged In" - the best approach的建议,我决定在一个cookie中散列用户的salt和密码的组合,并将用户的id(一个数字)存储在另一个cookie中。当然,哈希值也将存储在数据库服务器端,以便在用户再次返回时进行验证。我使用的salt值与我用来首次注册时用户密码的哈希值相同,因此它是静态的 - 它在会话之间不会改变。我用这种方法看到了一些问题。

1)如果注册盐是静态的,或者我每次为cookie生成不同的盐,是否使用注册盐?

2)如果有人要访问cookie并将它们复制到另一台计算机,然后尝试从该计算机访问该网站,理论上,它会自动将它们登录到该用户的帐户,这不是安全问题?

3)在某些具有恶意意图的用户要访问数据库的情况下,安全网站会使用密码和哈希密码,这使得黑客很难获得对多个帐户的访问权限(如果有的话)。但是,通过简单地使用hash和salt值并创建一个与数据库中已更改的值相匹配的cookie,他们可以有效地访问他们想要的任何帐户,从而使整个密码散列过程变得毫无用处。因此,我现在使用的这种cookie方法会影响我的整个数据库和所有用户的帐户。

所以我的问题是,如何在PHP中存储cookie以及敏感信息,例如用户密码的哈希,而不必担心上述问题?当然,像Gmail和Hotmail这样提供“让我登录”功能的网站遵循比我现在所做的更安全的方法,那么他们将如何做呢?

1 个答案:

答案 0 :(得分:11)

不要将密码存储在cookie中,是否存在哈希值。事实上,没有理由在cookie中存储任何敏感内容。您需要做的就是将128位(或更大)的随机ID映射到数据库中的用户帐户,并将该ID存储在cookie中。没有人会通过远程蛮力来猜测有效身份证明,特别是如果你有锁定。

  

如果有人要访问cookie并将它们复制到另一台计算机,然后尝试从该计算机访问该网站,理论上,它会自动将它们登录到该用户的帐户,这不是安全问题?

是。这是该功能的缺点。但是,如果您的网站检测到新的IP地址(特别是来自不同国家/地区)并需要第二步(将代码发送到移动设备等),那么您将解决此问题以及密码被盗的一般问题。 (这当然无助于防止本地网络攻击,如不安全的公共wifi。)

更方便的解决方案是要求“记住我”cookie使用SSL。这样黑客就不会在纯文本传输中看到cookie,并且可能需要进行本地攻击。 (如果是这样的话,记住我的cookie可能是用户最不关心的问题。)

  

他们可以有效地访问他们想要的任何帐户,使整个密码哈希过程变得毫无用处。

是的,不。如果您使用我描述的技术(随机ID),那么他们只能访问具有“记住我”cookie的帐户。但是,如果他们可以访问您的数据库,他们可以强制执行他们想要的任何帐户。如果密码本身很弱,即使是盐渍密码也很容易在本地破解。

此外,您可以将“记住我”登录视为半登录。访问购买东西,更改电子邮件地址等仍然需要输入密码。在没有密码的情况下,可以在留言板上进行无害的操作。

最后,请注意,PHP会话cookie只不过是一个临时的“记住我”令牌!这很多都适用于会话劫持的概念。 “记住我”的标记只会增加一个更大的机会之窗。

简而言之:不要在cookie中存储任何敏感内容,要求为cookie提供SSL,如果可能,请实施多因素身份验证...尤其是对于管理员帐户。