[英]PHP - Prepared VS not prepared query
我想知道准备好的查询是否和未准备好的查询一样安全。 以下是两个示例,一个用于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();
UPDATE示例:
$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));
我应该使用很长的路吗?还是只需要一行的路做得更糟?
不,它们在安全性方面并不相同。
将变量复制到字符串中的版本存在SQL注入漏洞的风险。 这取决于您如何处理变量。 如果在将它们复制到SQL字符串之前使用PDO::quote()
处理它们是安全的,但是如果您的开发人员忘记这样做,那是不安全的。
通常的说法是,准备好的语句速度较慢。 它们不是-实际上,它们至少可以从RDBMS的角度来看更快。
但是,在PHP应用程序中运行的额外代码会产生一些开销,因此,PHP运行时会降低性能。 但这只是一笔很小的开销。 我不会担心。
只需使用准备好的语句!
将快速版本用于唯一的语句,该语句不会在相同的结构中经常使用。
例如,在循环中使用长版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.