PDO MySQL:利用查询缓存和预准备语句安全性
MySQL 提供本机预准备语句和查询缓存以实现优化和安全。然而,问题出现了:在 PDO 配置中应该优先考虑哪些?
揭穿神话
普遍的看法是:
但是,这些语句可能不适用于最新的 MySQL 和 PHP 版本。
性能与安全性
在性能方面,MySQL 版本 5.1.17 或更高的允许使用准备好的语句进行查询缓存。因此,可以利用较新的 MySQL 和 PHP 版本同时利用性能和安全性。
关于安全性,本机准备好的语句不提供针对 SQL 注入的额外保护。 PDO 已经转义了查询参数值,并且此过程不受 EMULATE_PREPARES 设置的影响。
错误报告
本机准备好的语句在准备过程中会触发语法错误,而模拟准备时语句将此类错误推迟到执行时间。这会影响您编写的代码,尤其是使用 PDO::ERRMODE_EXCEPTION 时。
其他注意事项
建议
对于较旧的 MySQL 和 PHP 版本,建议模拟准备好的语句。但是,对于较新的版本,应使用本机准备好的语句(通过关闭仿真)。
自定义 PDO 连接函数
下面是 PDO 连接的代码片段具有最佳设置的功能:
function connect_PDO($settings) { $emulate_prepares_below_version = '5.1.17'; $dsnpairs = []; foreach ($settings as $k => $v) { if ($v !== null) { $dsnpairs[] = "{$k}={$v}"; } } $dsn = 'mysql:'.implode(';', $dsnpairs); $dbh = new PDO($dsn, $settings['user'], $settings['pass']); $serverversion = $dbh->getAttribute(PDO::ATTR_SERVER_VERSION); $emulate_prepares = (version_compare($serverversion, $emulate_prepares_below_version, '<')); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate_prepares); return $dbh; }
通过利用此功能或根据您的特定偏好对其进行自定义,您可以在性能之间实现理想的平衡以及 PDO 连接的安全性。
以上是PDO MySQL:准备语句还是查询缓存?您应该优先考虑哪一个?的详细内容。更多信息请关注PHP中文网其他相关文章!