我发现了“PHP PDO 的预准备语句可防止 SQL 注入”这句话。
我读过这篇文章:PDO准备好的语句足以防止SQL注入吗? 但那里的数据并不完全清楚。
嗯,乍一看你的问题看起来更复杂,只需一个链接就可以回答
php pdo的prepared语句如何防止sql注入?
使用 PDO 的其他优点/缺点是什么?
最有趣的问题。
PDO 最大的缺点是:它被兜售和传播为银弹,另一个值得崇拜的偶像。
如果不理解它,它就不会像任何其他工具一样发挥任何作用。
PDO 有一些关键功能,例如
使用PDO会降低效率吗?
再次强调,降低效率的不是PDO,而是prepared statements。 这取决于数据库服务器和您的应用程序之间的网络延迟,但对于最现实的情况,您可能会认为它可以忽略不计。
PDO 用于防止 SQL 注入的主要方法是在查询中准备带有参数的语句,并在执行查询时提供值。 PDO 将自动处理值中的转义引号和其他字符。 只要您在 every 查询中执行此操作,而不是直接将值放入查询中,就可以防止 SQL 注入。 您链接的问题中的答案显示了这是如何完成的。
使用 PDO 或任何 DBA 的主要优点之一是 PDO 封装了与实际 DB 的低级通信,使您只需处理实际的查询逻辑。 它可以让您轻松更改正在使用的数据库(MySQL、Postgre 等)。 它还可以更轻松地使用主/从设置和只读副本。
在大多数情况下,使用 PDO 只会比直接函数调用稍微慢一些。 无论如何,性能的轻微下降都是值得的。
我不会因为挑剔这个问题而烦恼,而是会给你真正问题的答案:
prepare
查询本质上运行mysql_real_esape_string
或每个标记上的一些等效项(由问号或:value
表示) 。 这使得确保所有变量数据都被正确转义变得更加容易。 这并不能防止所有安全问题(例如,%
和 _
不会被转义,这可能会影响 LIKE
子句)。
据我所知,使用
PDO
没有任何缺点。 我认为一个缺点是它不支持所有已知的数据库..驱动程序有限,但这只是一个缺点,如果您想将 PDO 用于它无法支持的数据库。 优点? 好吧,您可以从 PDO 中获得很大的灵活性,特别是如果您为它创建一个包装器(以防万一您需要切换 DBA),并且由于它是用 C 语言编译的,因此据说比使用其他 php 函数更快(见下文)。 它还使您不必编写自己的方法来准备查询等。
与什么相比降低效率? 什么样的效率?编程效率,还是执行速度? 据我了解,PDO 是经过编译的,因此使用它实际上应该比创建自己的数据库包装器来准备查询等“更快”。 如果这确实是一个问题,您可以对差异进行基准测试,但我建议您首先在其他地方寻找减速情况。