具有Remember Me功能的登录表单和未经授权访问Login_success.php URL php的网站


Login Form with Remember Me function AND unauthorized site access to login_success.php URL PHP

我在实现一个登录系统时遇到了一点困难,该系统既允许用户通过cookie记住,又不允许使用网站URL 进行未经授权的访问

这是我成功登录的代码,问题就在这里,因为我得到了一个重定向错误:

<?php
session_start();
// IF USER NOT REMEMBERED OR NO SESSION THEN THROW HIM OUT TO LOGIN
 if (!isset($_SESSION['valid'])|| !isset($_COOKIE['myusername']))
 {
   header("Location: index.php");
 }
$host="localhost"; // Host name
$username="root"; // Mysql username
$password="*****"; // Mysql password
$db_name="secure_login"; // Database name
$tbl_name="users"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
$sql="SELECT * FROM $tbl_name WHERE username='$myusername'";
$result=mysql_query($sql);

?>

会话有效,但一旦我关闭浏览器并重新打开它到我的网站,我就会得到一个REDIRECT LOOP

这是处理我的表单的代码:

<?php
session_start();
//CHECK IF EITHER SESSION OR COOKIE EXISTS THEN REDIRECT TO LOGIN_SUCCESS ELSE CONTINUE TO FORM
function loggedin()
{
 if (isset($SESSION['valid']) || isset($_COOKIE['myusername']))
 {
        $loggedin = TRUE;
        return $loggedin;
 }
}
if (loggedin())
{
   header("Location: login_success.php");
}
// REST OF CODE IS PROCESSED AFTER USER CLICKS SUBMIT ON LOGIN FORM
if(isset($_POST['submit']))
{
$host="localhost"; // Host name
$username="root"; // Mysql username
$password="*****"; // Mysql password
$db_name="secure_login"; // Database name
$tbl_name="users"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// username and password sent from form
$myusername=$_POST['username'];
$mypassword=$_POST['password'];
$rememberme=$_POST['rememberme'];
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$encrypted_mypassword=md5($mypassword);
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$encrypted_mypassword'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
if(mysql_num_rows($result) == 1) //user exists
{
  if ($rememberme=="on"){
      setcookie("myusername", $myusername, time()+7200);
   }
 elseif ($rememberme==""){
      $_SESSION['valid'] = 1;
  }
header('Location: login_success.php');
exit();
}
if($myusername=="phillip.k@fixnode.ca" && $encrypted_mypassword=="a66d83940f5d22fa54ee51ce"){
 header('Location: register.php');
}
else {
echo '<div class="alert">Incorrect Username or Password!</div>';
}
}
?>

所以基本上来说,当用户输入有效的用户名和密码并点击记住我时,即使用户关闭了浏览器(即记住我按钮中的COOKIE),我也希望浏览器重定向到login_success。但现在,如果用户关闭浏览器并重新打开我的网站,那么用户可能会因为cookie 而收到REDIRECT LOOP

非常感谢任何帮助

Phillip K

问题就在这里:

if (!isset($_SESSION['valid'])|| !isset($_COOKIE['myusername']))

您应该使用&amp;。您永远不会同时设置它们,因此会出现重定向循环。我很快发现的另一个问题是,当用户访问页面时,你似乎永远不会更新cookie"myusername"。

按照建议,您可以使用现有的解决方案,但如果您真的想自己做,我强烈建议将代码拆分为可重用的函数/类。

Md5不是存储用户密码的安全方法,您应该使用bcrypt或类似的现有解决方案。

我还将确认每次页面访问之间的IP,作为防止会话劫持的对策(这需要将会话数据存储在数据库中,这无论如何都是个好主意)。

我推荐一个现成的身份验证解决方案。

例如http://pear.php.net/package/Auth.看看

的例子