PHP PDO 的prepared语句如何防止sql注入?使用 PDO 还有哪些其他好处?使用PDO会降低效率吗?

问题描述 投票:0回答:3

我发现了“PHP PDO 的预准备语句可防止 SQL 注入”这句话。

  • php PDO(PDO 的准备语句)如何防止 sql 注入?
  • 使用 PDO(PDO 的准备好的语句)还有哪些优点/缺点?
  • 使用PDO(PDO的prepared statements)会降低效率吗?

我读过这篇文章:PDO准备好的语句足以防止SQL注入吗? 但那里的数据并不完全清楚。

php pdo sql-injection
3个回答
8
投票

嗯,乍一看你的问题看起来更复杂,只需一个链接就可以回答

php pdo的prepared语句如何防止sql注入?

准备好的语句如何防范 SQL 注入攻击?

使用 PDO 的其他优点/缺点是什么?

最有趣的问题。
PDO 最大的缺点是:它被兜售和传播为银弹,另一个值得崇拜的偶像。
如果不理解它,它就不会像任何其他工具一样发挥任何作用。
PDO 有一些关键功能,例如

  • 数据库抽象。这是一个神话,因为它不会改变 SQL 语法本身。而且您根本无法将 mysql 自动增量 id 与 Postgre 一起使用。更不用说切换数据库驱动程序并不是开发人员经常做出的决定。
  • 占位符支持,实现本机准备好的语句或模拟它们。很好的方法,但非常有限。缺少必要的占位符类型,例如标识符或 SET 占位符。
  • 一种辅助方法,无需编写循环即可将所有记录放入数组中。只有一个。当您需要至少 4 个才能让您的工作合理且不那么无聊时。

使用PDO会降低效率吗?

再次强调,降低效率的不是PDO,而是prepared statements。 这取决于数据库服务器和您的应用程序之间的网络延迟,但对于最现实的情况,您可能会认为它可以忽略不计。


1
投票
  1. PDO 用于防止 SQL 注入的主要方法是在查询中准备带有参数的语句,并在执行查询时提供值。 PDO 将自动处理值中的转义引号和其他字符。 只要您在 every 查询中执行此操作,而不是直接将值放入查询中,就可以防止 SQL 注入。 您链接的问题中的答案显示了这是如何完成的。

  2. 使用 PDO 或任何 DBA 的主要优点之一是 PDO 封装了与实际 DB 的低级通信,使您只需处理实际的查询逻辑。 它可以让您轻松更改正在使用的数据库(MySQL、Postgre 等)。 它还可以更轻松地使用主/从设置和只读副本。

  3. 在大多数情况下,使用 PDO 只会比直接函数调用稍微慢一些。 无论如何,性能的轻微下降都是值得的。


1
投票

php pdo的prepared语句如何防止sql注入

我不会因为挑剔这个问题而烦恼,而是会给你真正问题的答案:

prepare
查询本质上运行
mysql_real_esape_string
或每个标记上的一些等效项(由问号或
:value
表示) 。 这使得确保所有变量数据都被正确转义变得更加容易。 这并不能防止所有安全问题(例如,
%
_
不会被转义,这可能会影响
LIKE
子句)。

使用 PDO 的其他优点/缺点是什么?

据我所知,使用

PDO
没有任何缺点。 我认为一个缺点是它不支持所有已知的数据库..驱动程序有限,但这只是一个缺点,如果您想将 PDO 用于它无法支持的数据库。 优点? 好吧,您可以从 PDO 中获得很大的灵活性,特别是如果您为它创建一个包装器(以防万一您需要切换 DBA),并且由于它是用 C 语言编译的,因此据说比使用其他 php 函数更快(见下文)。 它还使您不必编写自己的方法来准备查询等。

使用PDO会降低效率吗

与什么相比降低效率? 什么样的效率?编程效率,还是执行速度? 据我了解,PDO 是经过编译的,因此使用它实际上应该比创建自己的数据库包装器来准备查询等“更快”。 如果这确实是一个问题,您可以对差异进行基准测试,但我建议您首先在其他地方寻找减速情况。

© www.soinside.com 2019 - 2024. All rights reserved.