PHP / SQL Ban状态未回显

Posted

技术标签:

【中文标题】PHP / SQL Ban状态未回显【英文标题】:PHP / SQL Ban status not echoing 【发布时间】:2018-08-07 00:53:20 【问题描述】:

我创建了一个 Banned.php 页面,所以说用户被禁止了,只要他们被禁止,他们就会重定向到banned.php 页面!

问题我将status 设置为1 很好,但禁止Reason 不会为该用户回显

bans 的 SQL 表有这些表 username & reason

代码:

<?php 
        //Check if the user is banned
        $SQL = $odb -> prepare("SELECT `status` FROM `users` WHERE `username` = :username");
        $SQL -> execute(array(':username' => $username));
        $status = $SQL -> fetchColumn(0);
        if ($status == 1)
            $ban = $odb -> query("SELECT `reason` FROM `bans` WHERE `username` = '$username'") -> fetchColumn(0);
            if(empty($ban)) $ban = "No reason given."; 
            $error = 'You are banned. Reason: '.htmlspecialchars($ban);
                                   ?>

如果您可以帮助我尝试 error_reporting 但无法获取错误,则不会显示原因/从 SQL 中获取

【问题讨论】:

我在这里看到了 SQL 注入和错误的代码结构。 请提供 1) 连接创建代码; 2)您用于错误报告的代码; 3) CREATE TABLE 语法。 我还建议只使用一个表users,其结构如下:user_id | username | banned | ban_reason 【参考方案1】:
$sql = "SELECT reason FROM bans WHERE username LIKE '$username' LIMIT 1";
$result = $odb->query($sql);

然后$ban = $result-&gt;fetchColumn();$ban = $result-&gt;fetchColumn()[0];

$stmt 可能是一个不太容易混淆的变量名,因此$sql 通常用于查询字符串。

fetchColumn() 至少可以与PDO 一起使用,但不清楚使用的是哪个驱动程序。

【讨论】:

【参考方案2】:

示例数据库表

(运行代码 sn-p 以查看“格式化”表。)

<table border="1px solid black;">
  <tr>
    <td>UserID</td>
    <td>Username</td>
    <td>Status</td>
    <td>Reason</td>
  </tr>
  <tr>
    <td>51414</td>
    <td>FelixCrystal</td>
    <td>0</td>
    <td>System exploitation.</td>
  </tr>
</table>

示例代码

$Server = "localhost";
$Username = "myDBUsername";
$Password = "myDBPassword";
$dbName = "myDBName";
$Connect = mysqli_Connect($Server, $Username, $Password, $dbName);
$SQL = "SELECT Status,Reason FROM Users WHERE UserID='51414'";
$Result = MySQLi_Query($this->Link, $SQL);
// Maybe 'If ($Result->num_rows == 0)' would be better to avoid duplicate accounts (Which shouldn't happen for ID based tables anyways)
If ($Result->num_rows > 0) 
    While ($Row = $Result->fetch_assoc()) 
        $Status = $Row["Status"];
        $Reason = $Row["Reason"];
    
    If ($Status == 0 /* Or whatever your 'banned' value is */) 
        Header("Location: https://www.example.com/MyBannedPage.php?Reason=$Reason");
        /*
            I used a GET request for this example. You can use anything you'd like such as GET, POST, Sessions, Cookies, etc.
        */
     Else 
        // Account is active!
    
 Else 
    Echo "Error looking up account.";

MyBannedPage.php

<?php
    If (Isset($_GET["Reason"])) 
        $Reason = $_GET["Reason"];
     Else 
        $Reason = "Banned reason not supplied.";
    
    Echo "Your account has been banned. Reason: $Reason";
?>

【讨论】:

其实他用的是PDO扩展。 @dakis,是的,我意识到谢谢。这更多是为了展示检索的逻辑和选项。它可以很容易地转换为 PDO。 编码风格很奇怪。建议使用小写的 GET/POST 参数、保留关键字和函数名。此外,对于 URL,最好使用小写(在 Linux 服务器中,大写 URL 与小写 URL 不同)。最后,UserID 可能是一个整数,不需要用单引号括起来。 @Raptor,我知道这不是传统的,但它工作得很好。我使用 CentOS,它是一个没有问题的 Linux 发行版。但是,我确实验证了大写和小写字母的 URL,这无疑是一个不必要的步骤,但仍然是我的偏好。只要不损失性能(不考虑微优化),我的语法和任何语法一样好。 单引号除外。您对此很满意,因为它可以被排除在外。当我们知道该值是整数时,无需进行不必要的比较,因此感谢您的观察。【参考方案3】:

好的,我设法获得了显示的原因,但是当从面板输入状态时,它使用 INSERT 不更新,因此不显示最新的禁止原因,如下所示:http://prntscr.com/kfq2pi gggggggg 是旧的禁止原因,Banned as a test 是新的原因,但它一遍又一遍地插入这里是我尝试使用 UPDATE 但无济于事的代码

代码: if ($status != $_POST['status']) $SQL = $odb -> prepare("UPDATEusersSETstatus= :status WHEREID= :id"); $SQL -> execute(array(':status' => $_POST['status'], ':id' => $id)); $status = htmlspecialchars($_POST['status']); $reason = htmlspecialchars($_POST['reason']); $SQLinsert = $odb -> prepare('INSERT INTObansVALUES(:username, :reason)'); $SQLinsert -> execute(array(':username' => $username, ':reason' => $reason)); $update = true; $updateMsg = "Users status updated from $status to $_POST['status'] with Reason: $_POST['reason'] ";

【讨论】:

再次:为了能够正确帮助到您,请提供1)连接创建代码; 2) 您用于错误报告的代码; 3) CREATE TABLE 语法。此外,给我们整个 php 页面的代码,以便我们弄清楚您正在使用的值的语义含义。从截图看,你的表结构好像不对。【参考方案4】:

Sql查询: SELECT * FROM users WHERE status = '1' AND username = :username

【讨论】:

以上是关于PHP / SQL Ban状态未回显的主要内容,如果未能解决你的问题,请参考以下文章

sh 一次显示所有fail2ban jails的状态

从 PHP 中提取超过 1 个回显

记录php日志

CTFHub技能树 Web-SQL注入详解

CTFHub技能树 Web-SQL注入详解

为啥 if [ ...something... ];然后回显“退出状态是$?”总是发出 0?