mysql prepare为什么可以防注入

先说原因:PreparedStatement 预编译,再填充参数的,就算参数是字符串拼接的方式,也会把整体当成1个参数,不再进行语法语义等分析。

测试例子1:

 1 创建存储过程如下:
 2 drop procedure if exists `insert_test`;
 3 delimiter &&
 4 create procedure `insert_test`(in pdatas mediumblob)
 5 begin
 6 declare stmt mediumblob default '';
 7 start transaction;
 8 
 9 set @a = pdatas;
10 set @sqlstr = ''insert into test(name, level) value (?,1);
11 prepare stmt from @sqlstr;
12 execute stmt using @a;
13 deallocate prepare stmt;
14 
15 commit;
16 end
17 &&

执行注入语句:

 1 call insert_test("aa,1),(bb,"); 

如果能注入,则产生2条数据,而结果是一行数据:
name:aa,1),(bb,
level:1
说明,就算字符串以拼接的方式执行,还是会把字符串整体,当成1个参数

上一篇:[2018 徐州 网络赛|Hard to prepare ] 环形染色问题的公式解法


下一篇:如何撰写好一篇论文?