为什么此MySQLI Prepared语句允许SQL注入?
技术问答
287 人阅读
|
0 人回复
|
2023-09-14
|
今天,当我教学生如何防止它时SQL注入时,我有点尴尬。在专业项目中,我使用了准备好的句子/参数查询作为预防措施SQL注入一层(虽然我从来没有专业使用过)mySQL)。理论上,我认为使用准备好的句子是不可能的SQL注入。. Q# d- x5 E6 c( l9 h
但后来这样做了…# l9 K* ]4 D2 s7 p! g5 A2 G
$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 /
5 `" K% N0 v* e+ hphp这种类型的基本类型可以使用SQL注入感到困惑。假设参数 1 OR 1 = 1将被拒绝,因为它不是数字(显然,我可以操作数字检查…)。; p8 S U+ r9 E b4 q2 X
任何人都可以解释为什么这行得通,以及我对php / mysql不知道准备语句的地方吗?$ D4 l- {) {/ \! z
我的学校计算机开箱即用地安装了Zend WAMP。4 J& m* g: \0 i2 n
编辑:这是引起我困惑的字符串值:/ I6 s; u- ]: s- v! C# e. _) w
$Search = "1 OR 1=1";
% L) ~! p2 s3 J 解决方案: % t9 L. ^1 v9 D6 e, A/ E" D
没关系,这里没有类型SQL注入,您看不到所有产品的列表(至少您提供的代码无法显示)2 K+ A) y$ ^' ]4 e8 j
不需要强制转换int,让我们有更深入的了解bind_param实际作用:
4 n D4 r0 c8 V( c& D: b4 k& }: h: ~它有字符串 i”,表示1个integer参数- }1 t) j5 U1 B" f
您正在从$ _GET即 string
4 F* q: L! n. bbind_param尝试将String转换为int,因此,请检查以下内容php代码:
2 m. i' o7 v" u* zecho intval('a,10); / output 0echo intval('1a,10); / output 1echo intval('12a,10); / output 12echo intval('b1,10); / output 0echo intval('1 or 1=1,10); / output 1echo intval("?s=1 OR 1=1",10); // output 0所以,你输出id = 1产品,也许你有一些? |
|
|
|
|
|