我想知道准备好的查询是否与未准备好的查询一样安全。下面是两个示例,一个用于SELECT,另一个用于UPDATE。 第一行是未准备好的,第二行是准备好的查询。
SELECT示例:
$userDetails = $connection->query("SELECT * FROM Users WHERE Name='$username'")->fetch();
$userDetails = $connection->prepare('SELECT * FROM Users WHERE Name=?');
$userDetails->execute(array($username));
$userDetails = $userDetails->fetch();
更新示例:
$query = $connection->query("UPDATE Users SET SessionID='$sessionID' WHERE Name='$username'")->execute();
$query = $connection->prepare("UPDATE Users SET SessionID=? WHERE Name=?");
$query->execute(array($sessionID, $username));
我应该使用漫长的方式吗?还是只需要一行才能做得更差?
答案 0 :(得分:2)
来自文档
准备好的声明执行包括两个阶段:准备和 执行。在准备阶段,语句模板被发送到 数据库服务器服务器执行语法检查并初始化 服务器内部资源供以后使用。
重复执行
准备好的陈述可以重复执行。每次执行 绑定变量的当前值被计算并发送到 服务器。该语句不会再次解析。声明模板是 没有再转移到服务器。
预准备语句具有检查语法和重复执行的优点。当使用变量
动态生成sql时,特别优选准备语句您可以在此帖子MySQLi: query VS prepare
中阅读更多内容答案 1 :(得分:1)
不,它们在安全性方面并不相同。
将变量复制到字符串中的版本存在SQL注入漏洞的风险。这取决于你如何处理变量。如果在将它们复制到SQL字符串之前使用PDO::quote()
处理它们是安全的,但如果您的开发人员忘记这样做,则它是不安全的。
这是一个普遍认为准备好的陈述较慢的神话。它们不是 - 事实上,它们可以更快,至少从RDBMS的角度来看。
但是,PHP应用程序中运行的额外代码会产生一些开销,因此PHP运行时会有一些性能损失。但这是一个相当小的开销。我不担心。
只需使用准备好的陈述!
答案 2 :(得分:0)
将快速版本用于不会经常使用相同结构的唯一语句。
例如,在循环中使用长版本。