有人解释这一步,而sql注入请

qf9go6mv  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(323)

当我试图理解sqlinjection时,我没有得到这部分,首先这是我的代码

<?php
include "../chat/db.php";
if (isset($_GET['id'])) {
    $id = $_GET['id'];
    $query = "select user_n,user_id from users where user_id<$id union select 1,2 ";
    $sql = mysqli_query($con, $query);
    if ($sql) {
        if (mysqli_num_rows($sql) > 0) {
            while ($result = mysqli_fetch_assoc($sql))
                echo "user name: " . $result["user_n"] . "of the id= " . $result["user_id"] . "</br>";

        } else {
            echo "there's no results";

        }

    }

} else {
    echo "error";
}
$tt = rand(0, 30);
?>
</br>
<a href=<?php echo "sql.php?id=" . $tt; ?>> <?php echo $tt; ?>  </a>

结果很好,正如你在这张图片中看到的结果
我不明白的是这个联合选择1,2的结果
{user name:1of the id=2}出现是因为

union select 1,2

我的问题是为什么会出现这样的情况,如果有人能解释一下“选择1,2”这个步骤,谢谢你,如果有什么不清楚的地方,请回答,或者我解释得不好。

7tofc5zh

7tofc5zh1#

任何请求都可以通过sql注入操作查询。
例如,我可以请求您的页面:

http://example.com/chat/index.php?id=0+UNION+SELECT+TABLE_SCHEMA,TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES

基本上,任何人都可以注入任何sql查询,只要该查询选择两个表达式。只要加一个数字就可以了 id < $id 但是 $id 可以继续处理任何其他请求传递给php代码。
我不知道为什么查询包括 union select 1,2 . 我想这是一个在课堂上教你sql注入风险和 union select 1,2 是一种让指导者提示您sql注入涉及联合的方法。
您可以通过以下两种方式之一使此查询更安全:
将参数强制转换为数字,这将删除任何非数字部分:

$id = (int) $_GET['id'];

使用查询参数:

$query = "select user_n,user_id from users where user_id < ? union select 1,2 ";

看看如何在php中防止sql注入?有关查询参数的详细信息。

相关问题