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

时间:2018-06-18 08:05:51

标签: php mysql security sql-injection

虽然我想了解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>    

结果很好,正如你在这张照片中看到的那样 results

我不明白的是这个 union select 1,2 result

{用户名:id = 2} 出现是因为

union select 1,2

我的问题是为什么它如此表现出来,如果有人可以解释这一步&#34;选择1,2&#34; 谢谢你,如果有什么不清楚的话,或者我会严重解释我的观点。

1 个答案:

答案 0 :(得分:0)

任何请求都可以通过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 ";
    
  3. 有关查询参数的详细信息,请参阅How can I prevent SQL injection in PHP?