gpt4 book ai didi

php - 为什么这个 MySQLI 准备语句允许 SQL 注入(inject)?

转载 作者:可可西里 更新时间:2023-11-01 13:37:44 25 4
gpt4 key购买 nike

今天教学生如何防止SQL注入(inject)时,我有点尴尬。在专业项目中,我使用准备好的语句/参数化查询作为防止 SQL 注入(inject)的一层(尽管我从未专业地使用过 mySQL)。理论上,我认为使用准备好的语句时,SQL 注入(inject)是不可能的。

但后来这奏效了......

$Search = $_GET['s'];
$stmt = $mysqli->prepare("SELECT * FROM products WHERE id = ?");
$stmt->bind_param("i", $Search);
$stmt->execute();
$Results = $stmt->get_result();

如果我传递参数“?s=1 OR 1=1”,那么我可以获得所有产品的完整列表。我仍然无法在最后插入另一个查询,但我很困惑为什么这种类型的基本 SQL 注入(inject)在 mysql/php 中是可能的。我假设参数“1 OR 1=1”会被拒绝,因为它不是数字(显然我可以运行该数字检查...)。

谁能解释为什么这行得通,以及我对 php/mysql 中的准备语句有什么不理解的地方?

顺便说一句,我学校的计算机安装了开箱即用的 Zend WAMP。

编辑:这是导致我混淆的字符串值:

$Search = "1 OR 1=1";

最佳答案

没关系,这里没有任何类型的 SQL 注入(inject),您看不到所有产品的列表(至少您提供的代码无法显示)

你不需要转换为 int,让我们更深入地了解 bind_param 的实际作用:

它有字符串“i”,表示 1 个 integer 参数

您正在从 $_GET 传递值,它是 string

bind_param 尝试将 String 转换为 int,因此检查此 php 代码:

echo intval('a', 10); // output 0
echo intval('1a', 10); // output 1
echo intval('12a', 10); // output 12
echo intval('b1', 10); // output 0
echo intval('1 or 1=1', 10); // output 1
echo intval("?s=1 OR 1=1", 10); // output 0

所以,你输出了 id=1 的产品,也许你有一些?

关于php - 为什么这个 MySQLI 准备语句允许 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19846830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com