Documents真的只提到:
mysqli :: prepare - mysqli_prepare - 准备执行的SQL语句
我想知道在使用mysqli_prepare()
语句调用sql
之后实际发生了什么。
任何人都可以详细说明,为什么不能跳过它?这不能在mysqlite3
内部完成吗?
参考将不胜感激。
答案 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注入,所以换句话说出于安全原因。