PDO MySQL:使用 PDO::ATTR_EMULATE_PREPARES 平衡性能和安全性
简介
选择使用 PDO 的准备语句模拟(PDO::ATTR_EMULATE_PREPARES) 与否一直是争论的话题。为了阐明这个问题,本文解决了与性能和安全性相关的常见问题。
性能注意事项
-
声明 1: PDO 的准备模拟提高了性能,因为 MySQL 的本机准备绕过了查询缓存。
响应:此声明已过时。 MySQL 版本 5.1.17 及更高版本支持查询缓存中的预准备语句,从而实现性能优势和安全性。
-
附加说明:本机预准备语句可能会导致一次性查询产生更高的开销与模拟的准备好的语句相比。但是,如果重用预准备语句对象,原生预准备语句可以提高整体执行速度。
安全注意事项
-
声明 2: MySQL 的本机准备在安全性方面非常出色,可以防止 SQL注入。
响应: 两种方法都通过转义查询参数来提供针对 SQL 注入的保护。 PDO 模拟库中的准备,而本机准备发生在 MySQL 服务器上,但两者都会导致安全查询。
错误报告
-
声明 3:MySQL 的原生准备提供了更好的错误报告。
响应: 确实,本机准备可以在准备时提供语法错误。相反,模拟准备可能只会在执行时显示语法错误。这需要仔细考虑,特别是在使用 PDO::ERRMODE_EXCEPTION 时。
最近的 MySQL 版本
使用支持准备语句的 MySQL 版本 5.1.17 及更高版本在查询缓存中,建议禁用模拟(PDO::ATTR_EMULATE_PREPARES = false)。这提供了性能和安全性方面的优势。
其他注意事项
-
代码修改:请注意,禁用模拟会影响代码结构,尤其是使用时PDO::ERRMODE_EXCEPTION。
-
优化 PDO 连接的函数:为了方便起见,提供了一个示例 PDO 连接函数来设置最佳设置,包括处理旧 PHP 版本的字符编码。
以上是PDO MySQL:是否模拟准备好的语句?性能和安全影响的详细内容。更多信息请关注PHP中文网其他相关文章!