PHP:正确设置登录cookie


PHP: Properly Setting Cookies For Login

    if (strtolower($userDetail["username"]) == strtolower($username) && 
        $userDetail["password"] == hash("sha256", $password . $userDetail["salt"])) {       
        if ($remember == "true") { // Remember Me
            setcookie("logged", "$username", time()+60*60*24*365); // 1 Year
        } else {    
            setcookie("logged", "$username", time()+43200); // 12 Hours
        }
        header("Location: " . getenv("HTTP_REFERER"));
        die();
    } else {
        echo "Invalid login.";
    }

我正在努力使最好的登录我可能可以。我在这里看到的主要问题是饼干。我不是这方面的专家,所以以下是我的主要问题:

  1. 我应该把我的cookie设置成什么样子,这样别人就不能轻易复制cookie了?
  2. 我应该把盐放进饼干里吗?
  3. 我听说过除了盐之外还有代币,而且它们一直在变化。这是怎么回事?

我想知道如果这个调用我的cookie以上是有效的吗?正确的做法是什么?

$loginCheck = $_COOKIE["logged"];
if (isset($loginCheck)) {
    // logged in
}

我喜欢保持用户名不变,并将另一个cookie设置为sha1(salt . user . pass)

例如:

user=Truth
uid=6cb8d1e35e5982a8ef738a8583a5d98d6fe2c484

然后使用第一个cookie与数据库和已知散列进行比较。

你现在这样做的方式,任何人都可以复制一个cookie和任何人一起登录,甚至不知道他们的密码。把

logged=Admin expires Jan 1st 5000

你就可以走了。一旦你有了第二个可以比较的cookie,你就安全多了。


对于第三个问题,是的,你甚至可以把它缩写为:

if (isset($_COOKIE["logged"])) {

但是正如我所说的,您应该转向我所展示的更安全的格式。


查看这个绝对史诗教程在net.tutsplus.com更多关于这个主题。

我建议使用存储在客户记录上的uniqid,然后当您验证客户已成功登录时,使用客户记录中的uniqid设置cookie。这样就没有人能够复制cookie。如果你想确保cookie值的安全,你也可以在cookie值前加上一些前缀。

我认为将用户的密码合并到cookie中是一个危险的想法,因为人们倾向于在其他网站上使用相同的密码,即使它是加密的,在我看来它仍然是危险的。我认为使用与客户信息无关的值更安全。

<?php
/* A uniqid, like: 4b3403665fea6 */
printf("uniqid(): %s'r'n", uniqid());
?>

关于如何使用液体的参考:http://php.net/manual/en/function.uniqid.php