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



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

1) 如果是静态的,使用注册盐是个好主意吗?还是应该每次为饼干生成不同的盐?

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

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

因此,我的问题是,如何在PHP中存储带有敏感信息(如用户密码的哈希)的cookie,而不必担心上述问题?当然,像Gmail和Hotmail这样提供"保持我登录"功能的网站遵循的方法比我现在做的更安全,那么他们会怎么做呢?

无论是否哈希,都不要将密码存储在cookie中。事实上,没有理由在cookie中存储任何敏感内容。您所需要做的就是将128位(或更大)的随机id映射到数据库中的用户帐户,并将该id存储在cookie中。有人不可能通过远程暴力猜测有效的id,尤其是如果你有锁定的话。

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

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

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

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

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

此外,您可以将"记住我"登录视为半登录。购买物品、更改电子邮件地址等仍然需要输入密码。在没有密码的情况下,可以做一些无害的事情,比如在留言板上发帖。

最后,请注意,PHP会话cookie只不过是一个临时的"记住我"令牌!这在很大程度上适用于会话劫持的概念。"记住我"代币只是增加了一个更大的机会之窗。

简而言之:不要在cookie中存储任何敏感的东西,要求cookie使用SSL,如果可能的话,实现多因素身份验证。。。特别是对于管理员帐户。

相关内容

最新更新