小编Pau*_*rel的帖子

为什么这个MySQLI预处理语句允许SQL注入?

当我今天教学生如何防止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();
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以解释为什么这个工作,以及我不明白php/mysql中准备好的语句?

我的学校电脑有一个开箱即用的Zend WAMP安装btw.

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

$Search = "1 OR 1=1";
Run Code Online (Sandbox Code Playgroud)

php sql mysqli code-injection prepared-statement

5
推荐指数
2
解决办法
1387
查看次数

标签 统计

code-injection ×1

mysqli ×1

php ×1

prepared-statement ×1

sql ×1