php - 请有人在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”的这一步骤,谢谢,如果有不清楚的地方或者我解释得不好我的观点。
解决方案
任何请求都可以通过 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 的一种方式。
您可以通过以下两种方式之一使此查询更安全:
将参数转换为数字,这会删除任何非数字部分:
$id = (int) $_GET['id'];
使用查询参数:
$query = "select user_n,user_id from users where user_id < ? union select 1,2 ";
请参阅如何防止 PHP 中的 SQL 注入?有关查询参数的更多详细信息。