【发布时间】:2013-11-19 17:47:21
【问题描述】:
今天在教学生如何防止 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";
【问题讨论】:
-
两件事: 1 - 列的类型是什么:int 或 varchar? 2 - 如果您在 binparam 语句中指定类型会发生什么:
$stmt->bindParam(':id',$Search, PDO::PARAM_INT)。那应该将变量转换为整数 -
@stUrb 那是 PDO。这不是。此外,列的类型应该是无关紧要的。
-
您能否使用
$Search的特定固定值(例如字符串)重现该案例并更新代码? -
(另外,包括返回的行样本)
-
哎呀,确实是它的 mysqli 而不是 PDO。我的错。
标签: php sql mysqli prepared-statement code-injection