2 回答
TA贡献1856条经验 获得超17个赞
假设您在 cookie 中存储了攻击者可能猜到的东西(如username=bob
或admin=true
),这确实是不安全的。cookie 由客户端发送到服务器,攻击者可以干扰发送到服务器的 cookie(通过在浏览器中更改此设置或手动发送 http 请求)。因此,他可以发送他想要发送的任何 cookie,例如发送带有admin=true
.
另一方面,会话的内容存储在服务器端,用户无法操作。
TA贡献1111条经验 获得超0个赞
我不知道我的方式有多专业,但我正在使用它:
您可以在您的数据库的用户表中为标识符创建一列。
每次用户成功登录时,您可以创建一个随机散列并更新他在 DB 中的记录,将此散列作为他的标识符,并使用标识符散列为他设置一个 cookie。
因此,下次用户打开您的网站时,您可以检查是否设置了 cookie,如果是,您可以在您的数据库中搜索具有该标识符的记录,如果找到,则获取该记录并放入会话并在您的脚本中使用它。此外,每次用户注销并再次登录时,标识符都是一个新的哈希值。所以没有人可以猜测另一个用户标识符设置为 cookie 并执行 CSRF 攻击。
<?php
// example for creating a random string as identifier :
$randomByte = random_bytes(15);
$identifier = bin2hex($randomByte);
setcookie('identifier', $identifier, (time() + 86400 * 30),'');
// example for remembering user
if (isset($_COOKIE['identifier']) && !is_null($_COOKIE['identifier']) && !empty($_COOKIE['identifier']) && !isset($_SESSION['userSignedIn'])) {
$cachedIdentifier = $_COOKIE['identifier'];
$userFoundByID = $usersInstance::selectByIdentifier($cachedIdentifier);
if (!empty($userFoundByID) && !is_null($userFoundByID)) {
$user = $userFoundByID[0];
$_SESSION['userSignedIn'] = $user;
}
?>
- 2 回答
- 0 关注
- 263 浏览
添加回答
举报