我想问一个关于拥有两个饼干的智慧的问题。在一个 PHP 文件中,可以找到以下代码:
//dbconn establishes connection to database and is not shown here
$salt = hash("sha512", rand().rand().rand());
mysqli_query($dbconn, "INSERT into `members` (`membername`, `password`,
`salt`) VALUES ('$membername', '$password', '$salt')");
setcookie("cookiemember", hash("sha512", $membername,
time() + 24*60*60, "/");
setcookie("cookiesalt", $salt, time() + 24*60*60, "/");
mysqli_close($dbconn)
在第二个 PHP 文件中,可以找到以下代码行:
if (isset($_COOKIE['cookiemember']) &&
isset($_COOKIE['cookiesalt'])) {
$cookymem = mysqli_real_escape_string($dbconn,
$_COOKIE['cookiemember']);
$cookysalty = mysqli_real_escape_string($dbconn,
$_COOKIE['cookiesalt']);
$result = mysqli_query($dbconn, "SELECT * FROM `members`
where `salt` = '$cookysalty'");
我不明白的是变量$salt的目的。您获取三个随机生成的数字,将它们连接起来,将安全哈希算法应用于此级联数字,然后将输出放入名为 members
的表中。然后,您可以使用此$salt变量作为 cookie 的值,但不是在从中转义特殊字符之前。当您已经通过散列加密字段名称membername
时,为什么要经历所有这些麻烦?为什么代码的最后一行不能简单地读取:
$result = mysqli_query($dbconn, "SELECT * FROM `members`
where `membername` = '$cookymem'");
有包含编码单词列表的大型数据库。例如这个网站。SALT用于使不可能简单地将HASH输入文本框,并希望对其进行解码。当然有解决方法,但SALTS使攻击者的工作变得更加困难,可能迫使他不使用它。正如弗拉基米尔在评论中指定的那样,请阅读本文,以便您了解 SALT 是什么。