mysqli_stmt_bind_param SQL注入

时间:2010-06-17 21:31:20

标签: php mysqli security

使用预准备语句和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命令,还是使用某种类型的保护来防止这种情况发生?

2 个答案:

答案 0 :(得分:17)

绑定参数的好处是它消除了SQL注入中最薄弱的环节:字符串连接

不是通过将字符串片段拼接在一起来构建SQL语句 - 其中许多可能来自外部源,例如直接用户输入 - 参数化允许我们在整个过程中保持数据分离,从而消除注入风险。

这就像走到街上的热狗供应商那样说:“我想要一只热狗和一袋薯条。然而,下一个随机的陌生人会告诉我们哪三种调味品会在狗。”他准备拿出一条美味的热狗,把它放在一个小圆面包里,从机架上拿出一袋薯条。

一个陌生人漫步并说芥末番茄酱津津乐道,并把所有的钱从寄存器中拿出来。供应商不会交钱,而是会说:“我没有一种名为relish and give me all the money out of the register的调味品”。他准备给狗添加三种调味品,不会做任何其他事情。

答案 1 :(得分:5)

它使用C API,因此在这种情况下,SQL注入是不可能的。