我已经阅读过用户能够操纵网站cookie并利用它来利用安全漏洞。我做了一个搜索,并在网上发布了一个想法。以下代码是在用户的用户名和密码经过身份验证后的代码;
$Separator = '--';
$uniqueID = 'jhlhgjh12u0@345';
$Data = $userID.' '.md5('65748');
$expire=time()+60*24;
setcookie('verify-user', $Data.$Separator.md5($Data.$uniqueID), $expire);
上面的代码将使用uniqueID,userID,MD5哈希数和分隔符设置cookie。 uniqueID,md5哈希数和分隔符由开发人员设置。这个想法是用户将无法操作cookie,因为不知道UniqueID和md5哈希数。下面的代码用于测试每个cookie是否被操纵
if ($_COOKIE) {
$Separator="--";
$uniqueID = 'jhlhgjh12u0@345';
$Cut = explode($Separator, $_COOKIE['verify-user']);
if (md5($Cut[0].$uniqueID) === $Cut[1]) {
$_COOKIE['verify-user'] = $Cut[0];
} else {
echo "fake cookie";
}
}
else {
echo "fake cookie";
}
我想知道这种方法是否安全,或者是否存在漏洞。欢迎批评和更正
答案 0 :(得分:2)
这称为邮件签名。您将消息与密钥一起散列并将该“签名”附加到消息本身。这允许收件人验证邮件的创建者/签名者是否拥有秘密,而不会泄露秘密本身。
您的特定实施的问题是
你应该使用更长的秘密,越长越好。您还应该使用适合该任务的散列算法,即HMAC(hash-based message authentication)。 E.g:
hash_hmac('sha512', $data, $secret)
您可以看到类似内容的实现,包括值到期,here。
最重要的是:首先想一想签名的纯文本消息是否是最好的方式。也许你想要一个类似会话的系统,其中一个完全没有意义的随机字符串被用作存储在服务器上的数据的id。这完全消除了用户操纵cookie的问题。