在我的 PHP 网站上,用户可以登录并有可能选中“记住我”来设置 cookie。
我应该将什么存储为SESSION
变量?用户名、散列密码和user ID
,或只有user ID
?如果我只存储user ID
,是否有人可以编辑SESSION
和更改 ID?
呢COOKIE
?我应该只存储user ID
? 据我所知,最终用户可以修改 cookie...
看来您对会话和 cookie 没有清晰的认识!
除了您的代码(除了攻击)之外,没有人可以更改会话内容。因此,您可以存储所有(合理的)喜欢user id
或username
需要经常访问的内容。在 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 :)
}
更新:
我写的这篇文章涵盖了这个概念。希望能帮助到你。
您应该将随机会话值存储在 cookie 中。您绝对不应该在 cookie 本身中存储有关用户的任何信息。然后,您可以在每次页面加载时检查 cookie 中的会话 ID,以确保 (a) 用户应该有权访问该内容以及 (b) 会话 ID 有效。
在 PHP 中您可以使用session_set_cookie_params
和session_name
来设置 cookie 的参数。
对于可能更喜欢使用 cookie 的人(因此,即使浏览器关闭,您也可以在很长时间后访问它),这是一种在 cookie 中存储粗略 ID 的安全方法:
为了防止库攻击匹配该随机字符串,您还可以在检查失败或阻止该 IP 一段时间后强制注销。
用户不能编辑会话变量,这些是在服务器上管理的。
会话变量优势
1.) 安全
2.) 健壮
会话缺点 1.) 生命周期短,直到会话存在,
当用户关闭他的浏览器服务器重新启动会话时会话被
销毁 session_destroy();
所以会话更安全
另一方面,Cookie 让您记住用户偏好
如果您将两者结合使用,那么它对您的代码有好处
You can store userid and username in cookie, then verify user identity using its combination.
如果它没有退出,那么您可以登录用户并将信息保留在会话中以及更新 cookie。