我有一个登录系统,每当用户成功登录时,会创建一些带有用户名密码的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");
提前致谢!
答案 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:username
,password
和typeOfUser
。您所使用的系统工作正常,但大多数身份验证脚本都使用会话,可以像cookie一样访问($ _COOKIE [' foo']),而是使用$ _SESSION变量。使用会话的优点是,除了服务器/站点上的脚本,查看或编辑之外,任何人都无法使用您存储在其中的值。通常,您向用户公开的信息越少越好。如果您需要澄清,请查看this StackOverflow post或PHP website上的基本示例。
还有一点要指出的是,在您的脚本中,if(isset($_COOKIE["username"])&&isset($_COOKIE["password"])){
没有其他声明。如果未定义这些cookie中的一个或两个,则不会执行任何代码,并且我假设的是受保护的页面将公开显示。您可能希望添加else
语句,类似于:
else{
header("location:http://www.example.com/login.php");
}
希望你能够使这个功能性和真棒!