首页 > 解决方案 > 请有人在sql注入时解释这一步

问题描述

虽然我试图理解 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”的这一步骤,谢谢,如果有不清楚的地方或者我解释得不好我的观点。

标签: phpmysqlsecuritysql-injection

解决方案


任何请求都可以通过 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 注入涉及 UNION 的一种方式。

您可以通过以下两种方式之一使此查询更安全:

  1. 将参数转换为数字,这会删除任何非数字部分:

    $id = (int) $_GET['id'];
    
  2. 使用查询参数:

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

请参阅如何防止 PHP 中的 SQL 注入?有关查询参数的更多详细信息。


推荐阅读