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.";
}
我正在努力使最好的登录我可能可以。我在这里看到的主要问题是饼干。我不是这方面的专家,所以以下是我的主要问题:
- 我应该把我的cookie设置成什么样子,这样别人就不能轻易复制cookie了?
- 我应该把盐放进饼干里吗?
- 我听说过除了盐之外还有代币,而且它们一直在变化。这是怎么回事?
我想知道如果这个调用我的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