登录脚本PHP上的重定向循环

时间:2014-10-14 01:14:43

标签: php redirect cookies login

我有一个登录系统,每当用户成功登录时,会创建一些带有用户名密码的cookie以及一些其他变量,这些变量放在URL中以配置会话:

setcookie("username", $myusername); //Sets a cookie storing the username
setcookie("password", $mypassword); //Sets a cookie storing the encrypted value of the password
setcookie("typeOfUser",$type); //example variable

并且变量通过URL传递:

header("location:http://www.example.com/logged.php?type=".$type);

在logged.php页面中我有一个名为protect.php的文件,它检查cookie是否存在以及它是什么类型的用户。

if(isset($_COOKIE["username"])&&isset($_COOKIE["password"])){
    //check if this user's cookies exist on the DB
    $user = $_COOKIE["username"];
    $pass = $_COOKIE["password"];

    $sql="SELECT * FROM USERS WHERE Usr='".$user."' and Pass='".$pass."';";
    $result=mysql_query($sql);

    // Mysql_num_row is counting table row
    $count=mysql_num_rows($result);

    if($count==1){
        $type = $_COOKIE["type"];
        header("location:logged.php?type=".$type);
        exit();
    }
    else{
         header("location:http://www.example.com/login.php");
    }
}

因此,如果用户只输入www.example.com/logged.php,他/她将获得与其用户关联的变量,但每当我这样做时,我会在网站上获得重定向循环。 (在我看来它有点显而易见,它重定向导致每次它进入标题(“位置...它重新启动,在顶部它检查protect.php ...但我无法找到一种方式解决这个问题)。

注意logged.php只有顶部:

include("protect.php");

提前致谢!

1 个答案:

答案 0 :(得分:3)

此脚本无限循环的原因基于逻辑:

if($count==1){
    header("location:logged.php?type=".$type);
}
else{
     header("location:http://www.example.com/login.php");
}

此时无论$count的值如何,您的脚本都会发送一个位置标头。换句话说,浏览器正在接收重定向,无论$count是否等于1。

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

结合此行,您的循环已定义。如果用户定义了这些cookie,则会评估为true,这在第一次登录时发生,或者已经登录。如果他们 已登录,他们的用户名和密码必须有效,$count最终会为1,因为他们在数据库中。

简而言之,每次用户登录后都会前往logged.php,此脚本会运行,因为他们拥有相应的Cookie,并且会再次定向到"logged.php?type=."$type"(一遍又一遍)再次)因为他们 是一个有效的用户并出现在数据库中。

要解决此问题,您需要在每次header("location:logged.php?type=".$type);运行时停止protect.php运行。这是您问题的关键。你可以随意解决这个问题,但我会用会话来解决这个问题。

查看this tutorial以了解如何在登录脚本中实施会话。

您已有三个Cookie:usernamepasswordtypeOfUser。您所使用的系统工作正常,但大多数身份验证脚本都使用会话,可以像cookie一样访问($ _COOKIE [' foo']),而是使用$ _SESSION变量。使用会话的优点是,除了服务器/站点上的脚本,查看或编辑之外,任何人都无法使用您存储在其中的值。通常,您向用户公开的信息越少越好。如果您需要澄清,请查看this StackOverflow postPHP website上的基本示例。

还有一点要指出的是,在您的脚本中,if(isset($_COOKIE["username"])&&isset($_COOKIE["password"])){没有其他声明。如果未定义这些cookie中的一个或两个,则不会执行任何代码,并且我假设的是受保护的页面将公开显示。您可能希望添加else语句,类似于:

else{
     header("location:http://www.example.com/login.php");
}

希望你能够使这个功能性和真棒!