虽然我想了解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; 谢谢你,如果有什么不清楚的话,或者我会严重解释我的观点。
答案 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的一种方式。
您可以通过以下两种方式之一使此查询更安全:
将参数转换为数字,删除任何非数字部分:
$id = (int) $_GET['id'];
使用查询参数:
$query = "select user_n,user_id from users where user_id < ? union select 1,2 ";
有关查询参数的详细信息,请参阅How can I prevent SQL injection in PHP?。