在我的PHP网站上,用户可以登录并可以选中“记住我”来设置cookie。
我应该将SESSION
变量存储起来?用户名,哈希密码和user ID
,或仅user ID
?如果我只存储user ID
,则有人无法编辑SESSION
并更改ID吗?
COOKIE
怎么样?我应该只存储user ID
吗?据我所知,最终用户可以修改cookie ...
答案 0 :(得分:20)
您似乎对会话和Cookie没有明确的愿景!
除了您的代码(攻击旁边),没有人可以更改会话内容。因此,您可以存储您需要频繁访问的所有内容(合理),例如user id
或username
。在cookie中,您必须存储一些模糊信息,以便您以后在用户尝试访问您的页面时识别该信息。所以基于cookie内容你可以重新生成用户会话(即自动重新登录用户)。请注意,用户可以更改cookie内容,因此出于安全原因,它不能像user id
那样简单。
我只是给你一个简单的例子,它远非完美但不是那么糟糕!您可能需要根据您的情况定制它:
在这里你可以像这样创建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 :)
}
更新:
我写了this article来涵盖这个概念。希望它有所帮助。
答案 1 :(得分:4)
您应该将随机会话值存储在cookie中。您绝对不应该在cookie本身中存储有关用户的任何信息。然后,您可以在每个页面加载时检查cookie中的会话ID,以确保(a)用户应该有权访问该内容,以及(b)会话ID有效。
在PHP中,您可以使用session_set_cookie_params
和session_name
来设置Cookie的参数。
答案 2 :(得分:1)
对于可能更喜欢使用cookie的用户(这样,即使关闭浏览器,您也可以在很长一段时间后访问它)是一种安全的方法,甚至可以将粗糙的ID存储在cookie中:
为防止库攻击匹配该随机字符串,您还可以在检查失败或在特定时间内阻止该IP时立即强制注销。
答案 3 :(得分:0)
用户无法编辑会话变量,这些变量在服务器上进行管理。
会话变量优势
1)安全
2.)鲁棒
会话缺点 1.)寿命短,直到会话,
会议被破坏了 当用户关闭他的浏览器时 服务器重启 会话使用session_destroy(); 销毁因此会话更安全
另一方面,Cookie会让您记住用户偏好
如果您使用两者的组合,那么它对您的代码的优势
You can store userid and username in cookie, then verify user identity using its combination.
如果它不退出,那么您可以登录用户并在会话中保留信息以及更新cookie。