今天在教学生如何防止SQL注入时,我有点尴尬。在专业项目中,我使用准备好的语句/参数化查询作为防止 SQL 注入的一层(尽管我从未专业地使用过 mySQL)。理论上,我认为使用预准备语句时 SQL 注入是不可能的。
但后来这奏效了......
$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 注入可以在 mysql/php 中实现。我假设参数“1 OR 1=1”将被拒绝,因为它不是数字(显然我可以运行该数字检查......)。
任何人都可以解释为什么这有效,以及我对 php/mysql 中准备好的语句不明白的地方吗?
顺便说一句,我学校的计算机上安装了开箱即用的 Zend WAMP。
编辑:这是引起我困惑的字符串值:
$Search = "1 OR 1=1";
没关系,这里没有任何类型的 SQL 注入,您看不到所有产品的列表(至少您提供的代码无法显示它)
您不需要强制转换为 int,让我们更深入地了解 bind_param 实际执行的操作:
它有字符串“i”,表示 1integer
争论
您正在从 $_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 的产品,也许你有一些?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)