页面保护对于管理员页面无法正常工作

时间:2013-02-03 17:52:04

标签: php admin webpage protection

  

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

我一直在尝试为管理员页面设置页面保护,但我无法让它工作。我相信如果我不是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 [&#39; mittbrukarnamn&#39; ] = $ _SESSION [&#39; myusername&#39;](英文)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

由于我今天似乎很多回答,我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);
        }
    }
}