1

目前,在用户登录后,我只需使用以下 PHP 代码将用户的 ID 号存储在 cookie 中:

setcookie('userid', "$userid", time()+60*60*24*7*2, '/');

上面的代码设置了一个持续 2 周的 cookie,其中包含非私有的用户 ID 号(存储在变量 $userid 中)。它还允许用户保持登录状态 2 周。我知道这可能是设置 cookie 以指示用户已登录的最不安全的方法之一,因为人们可以简单地更改他或她的 cookie 参数并以他或她希望的任何用户身份登录。

因此,我如何设置一个 cookie 来完成我上面的 cookie 完成的所有事情,但又是安全的?

换句话说,对我来说,设置一个安全的 cookie 并至少允许我在用户会话期间识别用户的 ID 号的最佳方法是什么?我还希望 cookie 持续 2 周,这样用户就不必一直重新登录我的网站。

4

5 回答 5

3

改用会话。它会将会话 ID 存储在 cookie 中,但所有实际数据都存储在服务器上,因此没有人可以弄乱它。

于 2012-10-18T03:39:52.503 回答
1

您还应该发送第二个 cookie,一个哈希值,对用户来说是唯一的。例如,在第二个 cookie 中存储用户 ID、用户名、密码和盐值的哈希值。

md5($userId.$userName.$passwordHash.$userSalt);

由于您从第一个 cookie 中知道用户 ID,因此在数据库中找到该用户。第二个 cookie 应该用于验证用户 ID。如果哈希 cookie 值不完全匹配,您就知道您的服务器没有提供第二个 cookie,您应该拒绝隐式登录请求。

于 2012-10-18T03:58:38.760 回答
0

将安全散列(仅服务器知道)与特定于用户的一些数据结合使用并创建散列。将其保存为值而不是 id。当您收到请求时,通过重新生成哈希来比较哈希。请注意,它仍然容易受到 XSS attach 或 CSRF 的攻击。因此,如果您担心,也请解决这些问题。Cookies 是存储数据的不好方式,上面将停止的是有人只是将 cookie 设置为随机用户 ID 并登录。

这是如果您想要自动登录并将其与会话 ID 分开。如果不按照其他答案的建议进行操作并使用会话。

于 2012-10-18T03:46:23.723 回答
0

登录成功后,所有用户数据都必须存储在会话中。当您调用时,session_start()将生成一个唯一 ID,并将其存储在浏览器 cookie 中。每次浏览器发出请求时,它都会将 cookie 中的值连同它一起发送。为了更强大的安全性,您可以regenerate在成功登录后获取会话 ID。

于 2012-10-18T03:49:50.243 回答
0

您也可以使用 mcrypt 来加密 cookie 中的一些数据,这是我在 cookie 中存储某些内容的首选方式。

如果您出于某种目的需要它,那么只需将其解密即可。

于 2012-10-18T03:56:50.257 回答