【问题标题】:Page protection does not work correctly for the Administrator page管理员页面的页面保护无法正常工作
【发布时间】:2013-02-03 17:52:04
【问题描述】:

我用不同的代码发布了一个类似的帖子,但改变了它 现在有点,并没有得到我希望的答案( 答案对我帮助不大)。我希望这没问题,如果不是,请告诉我。 :)

我一直在尝试为管理员页面设置页面保护,但无法正常工作。如果我不是 PHP 编码的新手,我相信这不会是一个问题,呵呵。

当类型为“0”的普通用户尝试访问管理员页面index_admin.php时,用户将被重定向到普通用户页面index.php。如果用户的类型为“1”,则用户/管理员将留在页面上。

这是我一直在尝试的代码。 (index_admin.php 中需要此文件,名为index_admin_check.php)。

index_admin_check.php

<?php
    session_start();
?>

<?php
    $vert = "localhost";
    $brukarnamn = "root";
    $passord = "";
    $db_namn = "nettsidebunad";
    $tbl_namn = "kunde_register";

    // Connection to the MySQL database.
    mysql_connect("$vert", "$brukarnamn", "$passord") or die ("Kan dessverre ikkje koble til databasen.");
    mysql_select_db("$db_namn") or die ("Kan ikkje finna den ynkjande databasen.");
?>

<?php
if (isset($_SESSION['mittbrukarnamn'])) {

    $sql1 = "SELECT `type` FROM $tbl_namn";
    $rad1 = mysql_query($sql1);
    $type1 = mysql_fetch_row($rad1);

    if ($type1 == 0) {
        echo "You do not have access to this page.";
        //header("location: index.php");
    } else {
        echo "You have access to this page.";


    }
}
?>

部分文字是挪威语。

$vert = $host(英文)

$brukarnamn = $usernamn(英文)

$passord = $password(英文)

$db_namn = $db_name(英文)

$tbl_namn = $tbl_name(英文)

$_SESSION['mittbrukarnamn'] = $_SESSION['myusername'](英文)

【问题讨论】:

  • 不要将mysql_ 系列函数用于新代码。由于从 PHP 中删除,这些函数已被弃用,并且不安全并且对 SQL 注入开放。相反,使用MySQLiPDO 使用参数化查询。

标签: php admin webpage protection


【解决方案1】:

您的 SQL 查询正在选择所有行,因为您没有 WHERE 子句。因此,当您调用mysql_fetch_row 时,它只会获取第一行。

您需要检查当前登录用户的类型

$sql1 = "SELECT `type` FROM $tbl_namn WHERE <user_name> = '$_SESSION[mittbrukarnamn]'";

另一个建议是不要使用 MYSQL,而是使用 MYSQLi 或 PDO 进行数据库操作,因为 PHP 不再维护 MYSQL,并且将在 PHP 5.5.0 中完全弃用。一些 MYSQL 函数已被弃用。

编辑:您的代码中还有另一个问题。 mysql_fetch_row 返回一个数组,因此您需要从数组中检索值。

if($type1['type'] == 0)

而不是

if($type1 == 0)

【讨论】:

  • = fornamn 嗯.. 所以我拿了你编辑的代码行:“$sql1 = " SELECT type FROM $tbl_namn WHERE fornamn = '$_SESSION[mittbrukarnamn]'"; ”,我也试过:“$sql1 = "SELECT fornamn, type FROM $tbl_namn WHERE fornamn = '$_SESSION[mittbrukarnamn]' ”; "并尝试过,但似乎 if 语句中的数字并不关心用户是 '1' 还是 '0',因为这些似乎只打开和关闭 if 语句。嗯......奇怪。
  • 哦,我使用 作为模板,因为我不知道存储用户名的确切列名。您必须将 替换为实际的列名。
  • 不能再编辑了,呵呵。所以我再次发布了它: = fornamnfornamn = username(英文)嗯.. 所以我拿了你编辑的代码行:“$sql1 = " SELECT type FROM $tbl_namn WHERE fornamn = '$_SESSION[mittbrukarnamn]'"; ”我也试过了:“ $sql1 = "SELECT fornamn, type FROM $tbl_namn WHERE fornamn = '$_SESSION[mittbrukarnamn]' "; "并尝试过,但似乎 if 语句中的数字并不关心用户的类型是 '1' 还是 '0',因为这些似乎只打开和关闭 if 语句。嗯...奇怪。
  • 啊哈,好的。我会尝试 :) *edited: 我提到 fornamn 是所有用户名/名字所在的列名。修改了好几遍,可能没有显示出来,呵呵。 :D
  • 我还在您的代码中发现了另一个问题,因此更新了我的答案以反映这一点。
【解决方案2】:

今天我似乎回答了很多问题,我有an admin panel on github 似乎回答了很多关于 php 登录的常见问题。在您的情况下,您只需从数据库中获取 type 并使用它。请注意,您必须在 SQL 中提供 WHERE 语句,否则您将没有该用户的信息。您将在该表中拥有它的每一部分

以下使用prepared queriesmysql_* functions are deprecated(不再支持;参见this SO question

function get_user_array() {
    /* Does all of the heavy lifting for getting user stats. */
    $db = new db(); // where db() is an abstraction class that implements mysqli and adds login details.
    if (isset($_SESSION["id"])) {
        $sid = $_SESSION["id"];
        if ($query = $db->prepare("SELECT id, name, status FROM `users` WHERE id=?")) {
                $query->bind_param("i", $sid); // i = integer
                $query->execute();
                $query->bind_result($id, $name, $status);
                $query->fetch();
                $query->close();
                $db->close();
                return array("name" => $name, "status" => $status, "id" => $id);
        } else {
            return false;
        }
    } else {
        return false;
    }
}

我的建议也是使用用户 ID,并从数据库中查找所有内容。这样,如果他们的用户名发生变化,整个网站不会在他们的页面加载时崩溃。


实际的比较是:

$user = get_user_array();
if (@$user["type"] != 'admin') { // @ error-handling will make it NULL anyway.
    header("Location: index.php"); // note: this must be sent BEFORE any output!
}

以及检查普通用户是否登录的快速比较(例如if logged_in()):

$user = get_user_array();
if (!@$user["id"]) { // continue only if logged in
    // not logged in handle
}

注意:db() 就是这个类(从长远来看,重写 mysqli 公共函数以缩短代码非常好,前提是您调用父级):

class db extends mysqli {
    public function __construct($a = DB_HOST,
                                $b = DB_USER,
                                $c = DB_PASS,
                                $d = DB_NAME,
                                $persistent = true) {
        if ($persistent) {
            parent::__construct("p:" . $a, $b, $c, $d);
        } else {
            parent::__construct($a, $b, $c, $d);
        }
    }
}

【讨论】:

  • 哇,谢谢;那是很好的信息。我会仔细看看。再次感谢。 :)
  • 我正在安装一个 mysql - mysqli 转换器(内置转换器)。你认为它会正确转换它吗?它被称为“E++”。
  • 我不能保证它会或不会起作用,因为我还没有听说过。您可能可以尝试(但先备份)。
  • 我的一个用户的类型为1,即使if 语句设置为仅当用户具有0 类型时才显示消息"You do not have access to this page.",它也会将其显示为全程。你知道为什么会这样吗?
  • 10 类似于布尔值(0 == false0 !== false 等)
猜你喜欢
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多