在PHP中保护登录cookie数据的最佳方法是什么?

5
我正在使用PHP创建一个登录系统,想知道如何最好地保护cookie中的用户信息字符串。我考虑使用某种密钥加密字符串?这是最好的方法吗?我有点新手。
提前感谢您的帮助。

6
你想保护它免受什么伤害? - Michael Borgwardt
可能会尝试轻易读取用户信息的cookie的人... - mattsven
1
所以你想保护你的数据的机密性(第三方无法阅读)而不是数据的完整性(数据的更改将被检测),对吗? - Gumbo
如果你要加密它,那么你需要保持密钥的安全。最好确保数据永远不离开服务器。 - tc.
5个回答

23
不要在Cookies中存储敏感信息。可以存储会话ID哈希值来将已登录的用户与其账户连接起来。

2
如果使用HTTPS,请标记cookie的安全标志,并将HTTPOnly设置为true。 - Tower

4
Aaron Harun为您提供了正确的答案。只要将数据存储在会话中,并且不让数据到达客户端/浏览器/用户,那么就基本上没有必要加密这些数据。当您在PHP上创建会话时,它会为您处理cookie相关事宜,因此您不必担心这个问题。在大多数情况下,不需要处理cookie,而在安全方面,处理cookie是有害的。
我曾经看到一些粗糙的网站,实际上将用户名存储在表单的隐藏字段中,这使得任何人都可以简单地编辑其本地副本的该表单,并以任何他们喜欢的用户身份采取行动。虽然这似乎是一个明显的问题,但Cookies也不是更好的选择。
如果您真正认为设计自制身份验证系统是个好主意,那么您需要首先设计数据库。不要存储明文密码,而是存储哈希值(如md5、sha-1等),并在此点上,为每个密码生成一个salt(一个随机字符串,将其附加到用户的密码之前进行哈希处理,并将该salt与密码哈希一起存储,因为您以后会需要它--这可以防止字典哈希攻击,例如彩虹表)。

2

您不应该在Cookie中存储安全信息。Cookie以文本格式保存在用户计算机上,有许多原因说明为什么您不应该在其中存储敏感信息:

  1. Cookie基本上是文本文件,可以使用任何文本编辑器在计算机上由任何人打开。
  2. Cookie存储在用户计算机上,这意味着他没有时间限制、连接限制、处理限制,因此他可以尝试无限次地强制破解任何数据而不必担心被禁止/踢出IP地址...

您应该只存储诸如用户名或会话ID等内容以进行记忆。


1
而且Cookie可以通过网络进行注入和检查。 - strager

0

如果您必须在cookie中而不是用户会话中存储信息,请考虑使用HMAC进行签名。hash_hmac函数是现代PHP版本中的内置函数。

如果您正在为“记住我”功能存储用户登录信息,请同时存储用户ID和仅在您的数据库中可用的信息哈希值。例如,将登录名和密码一起进行哈希处理,并将其与用户ID一起存储在cookie中是相对安全的。如果用户更改了密码,则使用该方法登录的所有计算机都将被使无效,而且不能简单地更改cookie中的ID并继续登录,因为用户名/密码哈希值将不匹配。


1
如何解密输出?还是只能单向的? - DrColossos
HMAC是一种哈希函数,因为没有加密,所以也就没有解密。它是一种篡改检测机制。另外,我很好奇为什么我被踩了。 - Charles
OP想要将数据存储在cookie中,然后稍后检索它。单向哈希函数不是答案。如果您想使用加密,可以使用其中一个加密函数,但有更好的方法。 - TheLQ
HMAC 的目的是对剩余数据进行签名,以确保其未被篡改。请在盲目投票之前至少阅读答案。 - Charles

0

你可以免费获得会话!这是由PHP/你选择的框架自动处理的服务器端存储的数据。你只需将数据放入会话中,它与客户端会话中存储的随机UID相关联。在客户端方面,这是会话cookie。此ID是自动生成的,你可以通过手动进行细粒度的行为控制。

客户端存储的数据永远不安全,没有真正的加密可用。无论如何,你都需要会话来跟踪已登录的用户。如果你有大量数据,可以使用ID来识别与其他数据存储(DB、XML等)相关联的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接