【问题标题】:Password protect a page?(with db access)密码保护页面?(具有数据库访问权限)
【发布时间】:2011-08-29 03:13:35
【问题描述】:

这里有几个问题:我的最终目标是密码保护文件logged_in.php。

注意:我只是一个初学者/中级程序员,所以我希望得到清晰的解释。

首先,我在数据库表中设置了用户名和密码。

  1. 我有两个页面:login.php 和 logged_in.php(名称仅用于示例目的)。我如何“要求”用户首先通过 login.php(登录过程)才能访问 logged_in.php(如果输入的用户名/密码正确)?

  2. 这是密码保护页面的最佳方式吗?

我尝试过的:

登录.php:

<?php
            $db_host="host";
            $db_user="user";
            $db_pass="pass";
            $db_name="name";
            $db_table="table";
            $user = mysql_real_escape_string(strip_tags($_POST['user']));
            $pass = mysql_real_escape_string(strip_tags($_POST['pass']));

            mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
            mysql_select_db($db_name) or die(mysql_error());

            if(isset($user) && isset($pass))
            {
                $sql = "SELECT * FROM $db_table WHERE username='$user' AND password='$pass'";
                $result = mysql_query($sql);
                $count = mysql_num_rows($result);
                if($count == 1)
                {
                    header("location:logged_in.php");
                }
                else
                    header("location:bad_login.html");
            }
        ?>
    1234563对每个人都是显而易见的......)。
  • 我把require(login.php);放在logged_in.php的顶部;然而,这并没有成功。

  • 我在 google 上查看了一些关于这个主题的好教程,不幸的是我找不到任何有明确解释的教程。

  • 我还在 stackoverflow 上看到了一些关于此主题的其他问题,但它们并没有真正帮助我。

我也有兴趣使用 phpMyAdmin 使用的方法来保护我的页面(当您输入 URL 并按 Enter 时,它会从浏览器顶部下拉一个菜单,要求输入用户名/密码) .我不知道那是怎么回事。如果有人能告诉我它是如何工作的,我愿意完全忽略我目前尝试使用的方法(如果 phpMyAdmin 方法足够安全并且相当容易实现)。

提前致谢!

【问题讨论】:

  • 只是一个兴趣点:您在连接到 MySQL 之前调用了mysql_real_escape_string()。该功能需要连接到 MySQL(参见 doc)。您应该将您的 mysql_connect() 队列移动 3 行。
  • 不值得回答的一般建议: 无论是否初学者,请阅读 PDO 以代替 mysql_* 函数;我前一阵子换了,再也没有回头。此外,Location header()“需要”一个绝对 URI(例如 http://server/path/to/resource;它不“需要”它,因此是引号,但某些用户代理可能不会重定向正确没有它
  • @Ozzah 感谢您告诉我。
  • @Bracketworks 好的,谢谢。

标签: php mysql database phpmyadmin password-protection


【解决方案1】:

使用 $_SESSION 变量:

<?php

            session_start();

            $db_host="host";
            $db_user="user";
            $db_pass="pass";
            $db_name="name";
            $db_table="table";

            mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
            mysql_select_db($db_name) or die(mysql_error());

            $user = mysql_real_escape_string(strip_tags($_POST['user']));
            $pass = mysql_real_escape_string(strip_tags($_POST['pass']));

            if(isset($user) && isset($pass))
            {
                $sql = "SELECT * FROM $db_table WHERE username='$user' AND password='$pass'";
                $result = mysql_query($sql);
                $count = mysql_num_rows($result);
                if($count == 1)
                {
                    $_SESSION['username'] = $user;
                    header("location:logged_in.php");
                    exit();
                }
                else
                    header("location:bad_login.html");
                    exit();
            }
        ?>

logged_in.php:

<?php

session_start();

// check if $_SESSION was setting before
if (!isset($_SESSION['username']))
{
    header("Location: login.php?e=access_denied");
    exit();
}
?>

phpMyAdmin 的登录方式不同,因为使用 MySQL 的用户名和密码登录,所以 phpMyAdmin 不需要像你的代码那样创建数据库和表来登录

你还需要注销:

注销.php

<?php

session_start(); // <-- Oops!!

// unset all $_SESSION variables
session_unset();
session_destroy();
header("Location: logged_in.php?m=logout_success");
exit;

?>

【讨论】:

  • 由于某种原因我无法让 logout.php 工作。这是我的代码:logged_in.php: logout.php 正是您在回答中所做的方式..
  • 这行“if(isset($user) && isset($pass))”有点奇怪,因为前两行应该总是设置$user和$pass。
  • @benck 你说得对,我只是从 Corease 代码中复制,我稍后会修复它,谢谢
  • @tttony 感谢您的更新。但是,还有一个问题,我在登录一次后仍然可以访问logged_in.php..即使我点击了退出..
  • @benck haha​​,这是真的,我不知道为什么我之前没有注意到这一点。谢谢你让我知道。
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
相关资源
最近更新 更多