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

Posted

技术标签:

【中文标题】登录脚本PHP上的重定向循环【英文标题】:Redirect loop on login script PHP 【发布时间】:2014-12-08 16:21:31 【问题描述】:

我有一个登录系统,每当用户成功登录时,都会使用他的用户名密码和一些其他变量创建一些 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】:

这个脚本无限循环的原因是基于逻辑:

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"(一遍又一遍),因为他们一个有效的用户并且存在于数据库中。

要解决此问题,您需要在每次运行 protect.php 时停止运行 header("location:logged.php?type=".$type); 这是问题的本质。你可以随心所欲地解决这个问题,但我会通过会话来解决。

查看this tutorial,了解如何在您的登录脚本中实现会话。

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

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

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

希望你能够让这个功能变得更实用、更棒!

【讨论】:

以上是关于登录脚本PHP上的重定向循环的主要内容,如果未能解决你的问题,请参考以下文章

IE6 上的重定向循环

cas单点登录出现的重定向循环问题解决方案

如何在移动设备的重定向页面上传递 PHP 会话值?

.htaccess Joomla -> Community Builder 中的重定向登录组件

shell实战案例批量注释nginx的重定向并进行文件对比

shell实战案例批量注释nginx的重定向并进行文件对比