如何加密网站cookie



我读过关于用户能够操纵网站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";
}

我想知道这种方法是否安全严密,或者是否也存在漏洞。欢迎批评和更正

这被称为消息签名。您将消息与一个秘密散列在一起,并将该"签名"附加到消息本身。这允许接收方验证消息的创建者/签名者是否拥有该秘密,而不会泄露该秘密本身。

您的特定实现的问题是

  • 这个秘密太小了
  • 哈希算法不适合该任务
  • cookie永远不会改变,也永远不会过期;如果饼干被偷了,就没有追索权

你应该使用更长的秘密,时间越长越好。您还应该使用适合该任务的哈希算法,即类似HMAC(基于哈希的消息身份验证)的算法。例如:

hash_hmac('sha512', $data, $secret)

您可以在这里看到类似功能的实现,包括值的过期


不过,最重要的是:首先要三思,签名的纯文本消息是否是最好的方式。也许您想要一个类似会话的系统,其中使用一个完全没有意义的随机字符串作为存储在服务器上的数据的id。这完全消除了用户操作cookie的问题。

最新更新