登录脚本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:username
、password
和 typeOfUser
。您拥有的系统运行良好,但大多数身份验证脚本使用会话,可像 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上的重定向循环的主要内容,如果未能解决你的问题,请参考以下文章