2

我希望有人可以帮助解决我正在处理的一些代码的这个小问题。请记住,这只是一个爱好网站,我知道存在安全漏洞。我编写了一个名为 set_remember_cookies 的函数,当用户选中“记住我”框时,它会从我的登录脚本和注册页面中调用。

每个安全页面上的一个函数然后执行以下操作:

  1. 检查是否设置了记住 cookie
  2. 查询数据库以查找与 cookie 中的哈希用户名关联的 User_ID
  3. 从用户表中获取该 User_ID 的密码
  4. 从 remember_cookies 表中获取盐
  5. 对密码 + salt 进行哈希处理,并将其与 cookie 中的哈希密码进行匹配

同样,我知道将散列密码存储在 cookie 中也是不安全的,但我现在并不担心。

我的问题是我在下面包含的 set_remember_cookies 函数实际上并没有设置 cookie。在受保护的页面上,第一步(检查 cookie 是否存在)失败。我还在浏览器中检查了 cookie,它们没有被存储。

谁能向我解释为什么这个功能没有设置cookies?我找不到任何错误,但希望有人可以!谢谢!

    <?php
      function set_remember_cookies($uid, $identifier, $password) {
          mysql_query("DELETE FROM remember_cookies WHERE User_ID = '$uid'"); //Delete old cookie records
          $salt = sha1(uniqid(time() . $_SERVER['HTTP_REFERER']));
          $username_hash = hash("sha256", $identifier . $salt); //Hash the username
          if (mysql_query("INSERT INTO remember_cookies (User_ID, Username_Hash, Salt) VALUES ('$uid', '$username_hash', '$salt')")) {
              setcookie("Username", $username_hash, 60*60*24*365);
              setcookie("Password", hash("sha512", $password . $salt), 60*60*24*365);
          }
      }
    ?>
4

2 回答 2

7

您的 cookie 在 1971 年的某个时间过期!看起来你想在未来一年抵消,所以试试

 setcookie("Username", $username_hash, time() + 60*60*24*365);

第三个参数不是“现在”的偏移量,它是从Unix 纪元开始的偏移量-相当精美的手册确实清楚地说明了这一点:)

于 2013-07-17T23:07:04.200 回答
1

setcookie(name, $value, $expire) ;

根据手册:您需要将过期时间添加到 time()

cookie 过期的时间。这是一个 Unix 时间戳,因此是自纪元以来的秒数。换句话说,您很可能会使用 time() 函数加上您希望它过期之前的秒数来设置它。或者你可以使用 mktime()。time()+60*60*24*30 将设置 cookie 在 30 天内过期。如果设置为 0 或省略,cookie 将在会话结束时(浏览器关闭时)过期。

于 2013-07-17T23:07:56.960 回答