mysqli_prepare()真正做了什么?为什么要由用户调用而不是由mysqlite3在内部处理?

时间:2017-09-11 16:08:15

标签: php mysqli

Documents真的只提到:

  

mysqli :: prepare - mysqli_prepare - 准备执行的SQL语句

我想知道在使用mysqli_prepare()语句调用sql之后实际发生了什么。

任何人都可以详细说明,为什么不能跳过它?这不能在mysqlite3内部完成吗?

参考将不胜感激。

2 个答案:

答案 0 :(得分:1)

execute()prepare()之间的区别不在于prepare()方法有一些内部标记,例如" secure=true;"这将被设置并且神奇地为SQL注入保存。实际上,当您使用错误时,也可以使用prepare()进行SQL注入:

$stmt = $db->prepare('SELECT password FROM user WHERE username = "'.$username.'"');
$stmt->execute();
// ...

准备语句的要点是SQL查询的值/参数/变量是从实际的SQL查询分离发送到MySQL服务器的。这样,values / arguments / variables不能更改您尝试发送的SQL查询。这可以防止SQL注入,其中输入包含"='' OR 1 = 1 --"等值。

预准备语句正在构建一个数据结构,您可以通过其他API调用(bind_param())设置预准备语句的值。 SQL服务器将使用"准备好的#34;声明并使用从bind_param()收到的值。已经读取,分析了查询,并且已经准备好了#34;并且在读取具有潜在危险数据的第一个值之前,现在(在该准备好的语句的持续时间内)被修复。 WHERE条件不能更改或削弱,无法追加另一个SQL查询或者可以编辑其他行/列/表。

因此,您不能将execute()内部重定向到prepare()以确保安全,因为您错过了bind_param()来电。话虽如此:当你有一个没有任何变量和/或用户输入的固定SQL查询时使用execute()并使用prepare()来准备语句,你有一个依赖于变量和/或用户的SQL查询输入。

答案 1 :(得分:0)

在很短的时间内,所有人都明白,你会想要使用预备语句(也就是mysqli_prepare)来阻止sql注入,所以换句话说出于安全原因。