登录网页自动注销

Login Web Page Automatic Logout

我正在创建一个登录页面,只为管理员提供重要信息。这是我目前成功的代码。

<?php
$username = "adminuser";
$password = "adminpass";
$randomword = "helloworld";

if (isset($_COOKIE['MyLoginPage'])) {
   if ($_COOKIE['MyLoginPage'] == md5($password.$randomword)) {

?>
<?php
$dbhost = 'localhost';
$dbuser = 'user';
$dbpass = 'pass';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');

$dbname = 'jrmathem_service';
mysql_select_db($dbname);

$query = "SELECT * FROM interact";
$result = mysql_query($query) 
or die(mysql_error()); 
print " 

<h3>Interact Event Sign-Up Results</h3>

<table border=\"5\" cellpadding=\"5\" cellspacing=\"0\" style=\"border-collapse: collapse\" bordercolor=\"#808080\" width=\"100&#37;\" id=\"AutoNumber2\" bgcolor=\"#C0C0C0\"><tr> 
<td width=100>Name</td> 
<td width=100>Grade</td>
<td width=100>Contact</td> 
<td width=100>A</td> 
<td width=100>B</td> 
<td width=100>C</td>
<td width=100>D</td> 
<td width=100>E</td>

</tr>"; 

while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
{ 
print "<tr>"; 
print "<td>" . $row['name'] . "</td>"; 
print "<td>" . $row['grade'] . "</td>";
print "<td>" . $row['contact'] . "</td>"; 
print "<td>" . $row['A'] . "</td>"; 
print "<td>" . $row['B'] . "</td>";
print "<td>" . $row['C'] . "</td>"; 
print "<td>" . $row['D'] . "</td>";
print "<td>" . $row['E'] . "</td>";

print "</tr>"; 
} 
print "</table>"; 
?>
<?php
      exit;
   } else {
      echo "<p>Bad cookie. Clear please clear them out and try to login again.</p>";
      exit;
   }
}

if (isset($_GET['p']) && $_GET['p'] == "login") {
   if ($_POST['name'] != $username) {
      echo "<p>Sorry, that username does not match. Use your browser back button to go back and try again.</p>";
      exit;
   } else if ($_POST['pass'] != $password) {
      echo "<p>Sorry, that password does not match. Use your browser back button to go back and try again.</p>";
      exit;
   } else if ($_POST['name'] == $username && $_POST['pass'] == $password) {
      setcookie('MyLoginPage', md5($_POST['pass'].$randomword));
      header("Location: $_SERVER[PHP_SELF]");
   } else {
      echo "<p>Sorry, you could not be logged in at this time. Refresh the page and try again.</p>";
   }
}
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post"><fieldset>
<label><input type="text" name="name" id="name" /> Name</label><br />
<label><input type="password" name="pass" id="pass" /> Password</label><br />
<input type="submit" id="submit" value="Login" />
</fieldset></form>

我在使用此代码时遇到的问题是,在我登录并退出 window 后,无论我是否打开完全相同的 [=18],它都会永远登录在我的计算机上=] 用于登录页面。所以,我的问题是

What and where can I specifically add into my code to make it so when you exit out of the window or tab, it automatically logs you out of the page so that when you log on again, you have you log in again.

谢谢你,我希望得到一些具体的反馈。

首先让我解释一下为什么您总是保持登录状态。这是因为您使用了 Cookie。如果登录成功,您正在使用这行代码设置一个 Cookie:

setcookie('MyLoginPage', md5($_POST['pass'].$randomword));

因为您没有为此 Cookie 设置超时,它将保留在用户的计算机上,直到他们决定手动清除他们的 Cookie。他们是否关闭浏览器并再次重新打开都没关系。 Cookie 仍会存在,因此用户会重新登录。

那么这个问题是怎么解决的呢?
有两种方法可以解决这个问题。第一个是在您的 Cookie 上设置超时。这有一些优点,但也有一些缺点。通过给你的 Cookie 一个超时时间,它会在时间过后失效。因此,如果您为 Cookie 设置 1 小时的超时时间,则用户可以在接下来的一小时内随意关闭和重新打开网站。之后,他们被迫再次登录。这可能对用户更友好,但也可能导致一些问题。就像用户在管理面板上工作超过 1 小时时被迫再次登录一样。

但是,您可以通过将超时重置为 1 小时来克服这个问题,每次他们在管理面板上积极地做某事。不管怎样,这里是你如何在 Cookie 上设置超时:

setcookie('MyLoginPage', md5($_POST['pass'].$randomword), time()+3600);

time() 是当前时间 + 3600 秒表示 Cookie 从现在起 3600 秒后失效。

我认为使用 SESSIONS 而不是 Cookies 是解决您的问题的更好方法。只要用户浏览您的网站,会话就会始终保持活动状态。一旦他们离开,或者关闭浏览器,Session 就消失了,他们别无选择,只能在再次访问时重新登录。

所以让我们用会话替换您当前的 setcookie

$_SESSION['MyLoginPage'] = md5($_POST['pass'].$randomword);

现在,在我们开始使用此会话之前,我们必须确保此会话保持活动状态。因此,在用户必须登录的每个页面上,您想在脚本之上执行以下操作,如下所示:

<?php
session_start();

如果不这样做,用户会话将立即被销毁,他们将被迫重新登录。现在我们已经准备好使用 Sessions,我们只需更改您代码的最后一部分:

if (isset($_COOKIE['MyLoginPage'])) {
    if ($_COOKIE['MyLoginPage'] == md5($password.$randomword)) {

我们将使用:

if (isset($_SESSION['MyLoginPage']) && $_SESSION['MyLoginPage'] == md5($password.$randomword)) {

所以现在我们不再检查 Cookie 是否存在,而是检查 Session 是否存在以及它是否具有正确的值。

使用 Session 而不是 Cookies 的另一个优点是您不需要用户许可就可以将它们写出来。在欧洲国家,法律规定必须获得用户许可才能编写 Cookie。然而,会话存储在服务器上而不是用户计算机上,因此不需要许可。

最后一个音符
我注意到您正在使用 mysql_*。这是正式弃用的代码。我强烈建议您查看 MySQLi or PDO 并学习使用准备好的语句。这将保护您免受大多数 SQL 注入和您的 MySQL 服务器免受用户输入可能导致问题的字符。

另外 md5 是一种非常不安全的 "encrypting" 密码方式。这是因为 md5 根本不是一种加密形式,而是一种哈希。在互联网上寻找更好的加密形式,例如 PHP Crypt and Blowfish.