【问题标题】:How to start a session and set access levels for users using mysql如何使用 mysql 启动会话并为用户设置访问级别
【发布时间】:2021-05-13 17:49:51
【问题描述】:

我已经准备好登录系统并且 100% 正常工作,但现在我想在登录时添加访问级别,但我不知道怎么做。在我的数据库中,在我的登录表中,我创建了一个名为“permission_level”的列,默认设置为“default”,管理员为“master”

我该如何解决这个问题?

尝试失败:

<?php

$mysqli = new mysqli('', '', '', '');

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT permission_level FROM authme WHERE = '".$user."'";
echo $user;

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        printf ("%s \n", $row["permission_level"]);
    }

    /* free result set */
    $result->close();
}


session_start();
$_SESSION['UserSession'] = $_POST['username'];

【问题讨论】:

  • 在继续上述要求之前,您应该知道您的脚本容易受到严重的 SQL 注入漏洞的影响。您永远不应该将用户输入直接连接到您的查询文本中。请改用prepared statements/parameterized queries
  • 它们只是获得我期望的结果的方法,但是经过几次不成功的尝试,我在这里问,sql注入我担心后面的步骤,以及我将使用的其他语言以及, 像 jquery
  • $user 没有赋值,所以会为空?阅读问题后,尚不清楚问题所在。 (除了 sql 注入)
  • $用户被分配到一个超级全局'$_POST ['用户名'],并且这个页面是有条件的,只有成功登录才有可能访问

标签: php mysql mysqli


【解决方案1】:

sql查询后需要将db表数据存入session变量中。

(1) 请移动 session_start();到页面的开头。

(2) 然后改变

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        printf ("%s \n", $row["permission_level"]);
    }

    /* free result set */
    $result->close();
}

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {

$_SESSION['permission_level'] = $_row['permission_level'];

        printf ("%s \n", $row["permission_level"]);
    }

    /* free result set */
    $result->close();
}

那么你可以使用 $_SESSION['permission_level'] 来做你想做的事(记得把 session_start() 放在所有使用 session 变量的 PHP 脚本的开头)

例如,如果您只希望权限级别 = "master" 的用户访问某个页面(例如 admin.php),那么在这个 admin.php 中,您应该在脚本顶部添加以下内容:

<?php
session_start();

if ($_SESSION['permission_level']!="master")
{
echo "You are not allowed to access this page";
exit();
}

// add other codes below this line.

?>

另一方面,正如@esquw 所提到的,也请使用参数化的prepared statement来避免SQL注入。

【讨论】:

  • 如何使用列值来限制某些级别不能访问某些东西?
  • 请参阅我稍作修改的答案,其中向您展示了一个示例。
  • 我不知道发生了什么,但是 "if ($result = $mysqli->query($query)){" 中的所有内容都不再起作用,我用 echo 对其进行了测试,并且未显示回声编辑:我的查询定义如下:“$query =”SELECT username, permission_level FROM authme WHERE username = ?";"
  • 如果你想在你的SQL语句中实现参数化预处理语句,请检查你的服务器是否支持Mysqli / PDO。 (否则它将不起作用)。即使它支持,您也需要修改代码以使用参数化准备好的语句,请参考网上的一些工作示例。
  • 之前,我测试了类似 fetch_assoc 的查询,但是我的查询不同,我不是只搜索一个用户,而是搜索了几个用户,但是当我添加查询 'WHERE 用户名 =?' if 停止工作。如何只搜索一个用户而不出现此错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 2016-08-16
  • 2016-02-15
相关资源
最近更新 更多