微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么此MySQLI Prepared语句允许SQL注入?

如何解决为什么此MySQLI Prepared语句允许SQL注入?

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

您不需要强制转换为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的产品,也许您有一些?

解决方法

今天,当我在教学生如何防止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”,那么我可以获得所有产品的完整清单。我仍然无法在末尾插入另一个查询,但是我对为什么在mysql /
php中可以使用这种类型的基本SQL注入感到困惑。我假设参数“ 1 OR 1 = 1”将被拒绝,因为它不是数字的(显然,我可以运行该数字检查…)。

任何人都可以解释为什么这行得通,以及我对php / mysql中的预备语句不了解的地方吗?

我的学校计算机开箱即用地安装了Zend WAMP。

编辑:这是引起我困惑的字符串值:

$Search = "1 OR 1=1";

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。