使用预准备语句和mysqli_stmt_bind_param时是否仍存在注入风险?
例如:
$malicious_input = 'bob"; drop table users';
mysqli_stmt_bind_param($stmt, 's', $malicious_input);
在幕后,mysqli_stmt_bind_param将此查询字符串传递给mysql:
SET @username = "bob"; drop table users";
或者它是通过API执行SET命令,还是使用某种类型的保护来防止这种情况发生?
答案 0 :(得分:17)
绑定参数的好处是它消除了SQL注入中最薄弱的环节:字符串连接。
不是通过将字符串片段拼接在一起来构建SQL语句 - 其中许多可能来自外部源,例如直接用户输入 - 参数化允许我们在整个过程中保持数据分离,从而消除注入风险。
这就像走到街上的热狗供应商那样说:“我想要一只热狗和一袋薯条。然而,下一个随机的陌生人会告诉我们哪三种调味品会在狗。”他准备拿出一条美味的热狗,把它放在一个小圆面包里,从机架上拿出一袋薯条。
一个陌生人漫步并说芥末,番茄酱,津津乐道,并把所有的钱从寄存器中拿出来。供应商不会交钱,而是会说:“我没有一种名为relish and give me all the money out of the register
的调味品”。他准备给狗添加三种调味品,不会做任何其他事情。
答案 1 :(得分:5)
它使用C API,因此在这种情况下,SQL注入是不可能的。