8

在我的 PHP 网站上,用户可以登录并有可能选中“记住我”来设置 cookie。

我应该将什么存储为SESSION变量?用户名、散列密码和user ID,或只有user ID?如果我只存储user ID,是否有人可以编辑SESSION和更改 ID?

COOKIE?我应该只存储user ID? 据我所知,最终用户可以修改 cookie...

4

4 回答 4

26

看来您对会话和 cookie 没有清晰的认识!

除了您的代码(除了攻击)之外,没有人可以更改会话内容。因此,您可以存储所有(合理的)喜欢user idusername需要经常访问的内容。在 cookie 中,您必须存储一些混淆信息,以便以后当用户尝试访问您的页面时您可以识别这些信息。因此,您可以根据 cookie 内容重新生成用户会话(即自动重新登录用户)。user id请注意,用户可以更改 cookie 内容,因此出于安全原因,它一定不能简单。

我只是给你一个简单的例子,它远非完美但还不错!您可能需要对其进行定制以适合您的场景:

在这里,您可以像这样创建 cookie 内容:

$salt = substr (md5($password), 0, 2);
$cookie = base64_encode ("$username:" . md5 ($password, $salt));
setcookie ('my-secret-cookie', $cookie);

稍后重新登录用户:

$cookie = $_COOKIE['my-secret-cookie'];
$content = base64_decode ($cookie);
list($username, $hashed_password) = explode (':', $hash);

// here you need to fetch real password from database based on username. ($password)
if (md5($password, substr(md5($password), 0, 2)) == $hashed_password) {
    // you can consider use as logged in
    // do whatever you want :)
}

更新:

我写的这篇文章涵盖了这个概念。希望能帮助到你。

于 2013-07-05T17:04:25.083 回答
5

您应该将随机会话值存储在 cookie 中。您绝对不应该在 cookie 本身中存储有关用户的任何信息。然后,您可以在每次页面加载时检查 cookie 中的会话 ID,以确保 (a) 用户应该有权访问该内容以及 (b) 会话 ID 有效。

在 PHP 中您可以使用session_set_cookie_paramssession_name来设置 cookie 的参数。

于 2013-07-05T17:01:18.240 回答
2

对于可能更喜欢使用 cookie 的人(因此,即使浏览器关闭,您也可以在很长时间后访问它),这是一种在 cookie 中存储粗略 ID 的安全方法:

  1. 在用户数据库中创建一个新字段,将其命名为X
  2. 生成一个 cookie 来保存用户ID
  3. 生成一个安全(比如长)的RandomString并将其保存在另一个 cookie 中。
  4. 还将该随机字符串保存在X的字段中。
  5. 在成员区检查IDRandomString的 cookie 是否与数据库信息匹配。
  6. 当用户退出时清除列 X 并在下次登录时为X生成数据。

为了防止库攻击匹配该随机字符串,您还可以在检查失败或阻止该 IP 一段时间后强制注销。

于 2018-10-18T15:16:35.400 回答
0

用户不能编辑会话变量,这些是在服务器上管理的。

会话变量优势
1.) 安全
2.) 健壮

会话缺点 1.) 生命周期短,直到会话存在,


当用户关闭他的浏览器服务器重新启动会话时会话被
销毁 session_destroy();

所以会话更安全

另一方面,Cookie 让您记住用户偏好

如果您将两者结合使用,那么它对您的代码有好处

You can store userid and username in cookie, then verify user identity using its combination.

如果它没有退出,那么您可以登录用户并将信息保留在会话中以及更新 cookie。

于 2013-07-05T17:05:29.097 回答