【问题标题】:allow only specified users to access a page只允许指定用户访问页面
【发布时间】:2020-04-29 20:25:31
【问题描述】:

我在制作一个只有乐队成员才能访问他们自己的乐队页面的页面时遇到了问题。

我的波段表中的每个波段都有四列 $bandm1 $bandm2 $bandm3 和 $bandm4。

我尝试制作一个脚本来绘制会话用户名,然后从 url 中绘制 band_id,并且成功。但是当我尝试时:

脚本不工作。我的 AND/OR 语句有问题吗?

编辑: 这是我的完整代码:

        $user = $_SESSION['user_name'];
    $get_user = "
select * 
  from users 
 where user_name = '$user'
"; 
    $run_user = mysqli_query($con,$get_user);
    $row=mysqli_fetch_array($run_user);

    $user_name = $row['user_name'];

if(isset($_GET['band_id'])) {
$band_id = mysqli_real_escape_string($con, $_GET['band_id']);
if (ctype_alnum($band_id)){
    $q =  "SELECT * FROM bands WHERE band_id = '$band_id' ";

$r = mysqli_query($con, $q);
if($r){
while($row=mysqli_fetch_array($r)){
            $band_id = $row['band_id'];
            $band_name = $row['band_name'];
        }
}

}
?>

FROM bands 
WHERE band_id = '$band_id' 
      and (bandm1 = $user_name) OR (bandm2 = $user_name) 
          OR (bandm3 = $user_name) OR (bandm4 = $user_name)

它有效,但是当我将选择替换为: SELECT * FROM band WHERE band_id = '$band_id' and (bandm1 = $user_name) OR (bandm2 = $user_name) OR (bandm3 = $user_name) OR (bandm4 = $user_name)";

它停止工作

【问题讨论】:

  • 您的查询可能会失败,因为用户名周围没有引号。它也容易受到注入攻击。使用准备好的语句可以解决这两个问题。
  • 请不要创建这样的模式。枚举列是错误模式的标志。创建一个bandmembers 表并将band memberds 关联到band_id。例如您将如何处理 dave grohl 与当前架构和 nirvanafoo fighter 条目? the script didn't work 的描述性也不够。您是否收到错误、访问权限过多、访问权限不足等问题?
  • 您的代码容易受到 sql 注入 始终使用 prepared statements 参见 stackoverflow.com/questions/60174/…
  • @user3783243 我的系统当前有一个页面,在该页面中,乐队中的用户可以看到其中包含的乐队列表,如果他们的用户名包含在四个列中的任何一个中,那么乐队该列属于显示的 id,并带有指向“编辑乐队信息”页面的链接。
  • 为什么有4列?

标签: php html mysql restricted-profiles


【解决方案1】:

尝试在查询中添加括号:

SELECT * FROM bands WHERE band_id = '$band_id' and ( (bandm1 = $user_name) OR (bandm2 = $user_name) OR (bandm3 = $user_name) OR (bandm4 = $user_name) )

编辑:

您可能需要在这些变量周围加上引号,不确定您的脚本是如何构建的,但类似这样:

$query = "SELECT * FROM bands WHERE band_id = '".$band_id."' and ( bandm1 = '".$user_name."' OR bandm2 = '".$user_name."' OR bandm3 = '".$user_name."' OR bandm4 = '".$user_name."' )";

【讨论】:

  • 你的答案我容易受到 sql 注入的影响,请参阅stackoverflow.com/questions/60174/…
  • 我用引号和括号试过这个,它导致了同样的问题,它不会显示查询的信息,我更新了我的初始帖子以包含完整的代码,以及它的情况没有 AND 语句的炒锅
  • 在bandm1,bandm2等中。你是存储用户名还是用户ID?
  • @Jay 我正在存储用户名,主要是为了让用户更容易将用户名添加到列表中,也因为这就是我的用户会话所基于的
  • 我只是想了解这个脚本在做什么。所以这是一个“乐队的页面”?假设它是 ACDC 的。在您的数据库中,ACDC 的成员列为 bandm1='john'、bandm2='david' 等。因此您正在检查 $user_name 是否属于该乐队,否则他们将不会被允许出现在此页面上,对吗?也许您正在以不属于该特定频段的用户身份登录进行测试?这可以解释您的查询没有返回任何内容。
猜你喜欢
  • 2011-07-31
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多