2

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

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

4

1 回答 1

2

这称为消息签名。您将消息与秘密一起散列,并将该“签名”附加到消息本身。这允许接收者验证消息的创建者/签名者是否拥有秘密,而无需透露秘密本身。

您的特定实施的问题是

  • 秘密太小
  • 散列算法不适合该任务
  • cookie 永不更改,永不过期;如果 cookie 被盗,则没有追索权

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

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

您可以在此处看到类似事物的实现,包括值的过期


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

于 2013-08-23T08:28:08.340 回答