PHP会话,COOKIES和记住我功能

问题描述:

我有以下代码,当用户登录时,它们会显示两个文本框和一个复选框。PHP会话,COOKIES和记住我功能

设置3个曲奇,usernamepasswordremember所有工作,并在日志中脚本本身是comepletely罚款(我明白,在cookie中存储散列密码是不是最好的做法,但现在它会做)。

虽然会发生什么,但用户重新访问login.php页面(这一个),而他们已经登录在cookie中,因为$ _POST条件没有被满足而被一个一个地删除,因此行下面正在执行。我怎样才能防止这种情况发生。此外,任何建议来清理代码,我将无疑会结束了很多重复代码将不胜感激。由于

snippet from the 'login.php' page below

} elseif (!$_POST['remember']) { 
    $past = time() - 100; 
    if (isset($_COOKIE['remember'])) { 
     setcookie('remember', '', $past); 
    } elseif (isset($_COOKIE['username'])) { 
     setcookie('username', '', $past); 
    } elseif (isset($_COOKIE['password'])) { 
     setcookie('password', '', $past); 
    } 
} 

login.php

<?php 
session_start(); 
include("includes/config.php"); 

?> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Login</title> 
</head> 
<body> 
<?php 

$odb = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USER, DB_PASS); 

$username = ""; 
$password = ""; 

if (isset($_COOKIE['username']) && isset($_COOKIE['password'])) { 

    $username = $_COOKIE['username']; 
    $password = $_COOKIE['password']; 

} elseif (isset($_POST['username'])) { 

    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $password = md5(DB_SALT.$password); 

} 

$sql = "SELECT * from tblMembers WHERE username = :username"; 
$query = $odb->prepare($sql); 
$query->execute(array(":username" => $username)); 
$results = $query->fetchAll(); 
if($results !== FALSE && $query->rowCount()>0) { 
    if($results[0]['passwordHash'] == $password) { 
     $_SESSION['username'] = $username; 
     $_SESSION['userID'] = $results[0]['userID']; 

     if($_POST['remember']) { 
      $month = time() + (60 * 60 * 24 * 30); 
      setcookie('remember', $_POST['username'], $month); 
      setcookie('username', $_POST['username'], $month); 
      setcookie('password', $results[0]['passwordHash'], $month); 
     } elseif (!$_POST['remember']) { 
      $past = time() - 100; 
      if (isset($_COOKIE['remember'])) { 
       setcookie('remember', '', $past); 
      } elseif (isset($_COOKIE['username'])) { 
       setcookie('username', '', $past); 
      } elseif (isset($_COOKIE['password'])) { 
       setcookie('password', '', $past); 
      } 
     } 


     header("Location: "."index.php"); 
    } else { 
     echo "password incorrect"; 
    } 
} 
?> 
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> 
Username:&nbsp; 
<?php 
if(isset($_COOKIE['username'])) { 
    echo "<input type=\"text\" id=\"username\" name=\"username\" maxlength=\"40\" value=".$_COOKIE['username'].">"; 
} else { 
    echo "<input type=\"text\" id=\"username\" name=\"username\" maxlength=\"40\" value=\"\">"; 
} 
?> 
Password:&nbsp;<input type="password" id="password" name="password" maxlength="50"> 
Remember Me:&nbsp; 
<?php 
if(isset($_COOKIE['remember'])) { 
    echo "<input type=\"checkbox\" id=\"remember\" name=\"remember\" checked=\"checked\">"; 
} else { 
    echo "<input type=\"checkbox\" id=\"remember\" name=\"remember\">"; 
} 
?> 
<input type="submit" id="submit" name="submit" value="Log In"> 
</form> 
</body> 
</html> 
+0

这个cookie问题如何与mysql和PDO相关? – 2013-02-26 13:16:01

+0

因为它包含MySQL和PDO代码,所有其他类都与此有关,所以我猜想,如果我接触到更多的人,那么我将得到一个更加定制的答案,涉及我希望实现的内容。 – Mike 2013-02-26 13:27:55

你的代码说正是这应该发生。第一次请求后,remember POST参数将不再设置,因此if语句的计算结果为true。然后它会删除第一个cookie。下一次它会删除第二个,因为第一个已经不存在了。

也许你应该取代这一行:

elseif (!$_POST['remember']) { 

与此:

elseif (!$_POST['remember'] && !$_COOKIE['remember']) { 

你应该在那里摆脱elseif S的,因为你可能想要删除所有cookie。只要把if,它应该如你所愿。

并在旁注:!$var不是检查是否设置值的正确方法。改为使用!isset($var)

+0

你是这个意思吗? 'elseif(!isset($ _ POST ['remember'])&&(!isset($ _ COOKIE ['remember'])))' – Mike 2013-02-26 13:29:38

+0

是的......如果你根据变量的存在做出决定。如果该值也很重要,则可以安全地将'!$ _ POST ['remember']'与另一个'&&'添加到该条件中。只要确保在实际使用变量之前始终检查'isset()'。 – 2013-02-26 13:32:05

+0

谢谢你,那太棒了:) – Mike 2013-02-26 13:33:31