问题 PHP PDO的预处理语句如何阻止sql注入?使用PDO有哪些其他好处?使用PDO会降低效率吗?


我一直在发现这句话 PHP PDO's prepared statements prevents SQL injection

  • php PDO(PDO准备好的语句)如何阻止sql注入?
  • 使用PDO(PDO准备好的陈述)的其他利弊是什么?
  • 使用PDO(PDO准备好的声明)会降低效率吗?

我读过这个: PDO准备好的语句是否足以阻止SQL注入? 但那里的数据并不完全清楚。


4644
2018-01-03 21:34


起源

它不是PDO,它会阻止您进行SQL注入,它的预处理语句。您可以在不使用其预准备语句的情况下使用PDO,也可以使用其他扩展(MySQLi,SQLite3,...)。 - KingCrunch
我会修改我的问题。 :) - ThinkingMonkey
可能这个会更清楚: MySQL / PDO / Prepared Statements - 一切都很大,有点压倒性,有点令人困惑? - Your Common Sense
@ Col.Shrapnel阅读。将需要时间很长。 - ThinkingMonkey
有趣的是,在你所链接的问题中,我的[已删除]答案说接受的答案毫无意义。这个网站的工作方式很奇怪 - 无意义的答案被赞成和传播,而良好和合理的答案仍然模糊不清。我的猜测是因为很少有人能够真正理解其含义,而且大多数人都能理解 相信 一些答案是对的。我对此事的解释还有另一个问题: stackoverflow.com/questions/8263371/... - Your Common Sense


答案:


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

php pdo的预处理语句如何防止sql注入?

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

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

最有趣的问题。
一个最大的PDO缺点是:它被兜售并传播了一个银弹,另一个崇拜的偶像。
虽然没有理解,但它会像其他任何工具一样毫无益处。
PDO有一些关键功能,如

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

使用PDO会降低效率吗?

同样,它不是PDO,而是准备好了降低效率的陈述。 它取决于数据库服务器和您的应用程序之间的网络延迟,但您可能认为它对于最真实的情况可以忽略不计。


8
2018-01-03 21:50





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

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

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


1
2018-01-03 21:47



你是什​​么意思: It also makes it easier to work with master/slave setups and read replicas. 它有api支持吗? - ThinkingMonkey
@ThinkingMonkey不直接,但由于每个连接都包含在类实例中,因此您可以轻松地传递它们。 - Dan Simon
hmmmm .......... - ThinkingMonkey


php pdo的预处理语句如何阻止sql注入

我不会因为挑剔这个问题而烦恼,而是会给你真正问题的答案: prepare查询基本上运行 mysql_real_esape_string 或每个令牌上的等价物(由问号或。表示) :value)。这样可以更轻松地确保所有可变数据都已正确转义。这并不能防止所有安全问题(例如, % 和 _ 没有逃脱,这可能会影响 LIKE 条款)。

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

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

使用PDO会降低效率吗?

与什么相比降低效率?什么样的效率?编程效率还是执行速度?据我所知,PDO是编译的,所以实际上应该使用它 更快 而不是创建自己的数据库包装器来准备查询等。如果这确实是一个问题,你可以对差异进行基准测试,但我建议你先考虑减速。


1
2018-01-03 21:51



如果我的查询看起来像 SELECT * FROM table LIMIT ?,?  - 在令牌上运行mysql_real_esape_string有什么意义?如果我有目的地使用LIKE - 我为什么要禁止使用通配符?如果我不需要通配符 - 我不应该把它改成严格的比较吗?你自己使用PDO吗? - Your Common Sense
@ Col.Shrapnel我在某些应用程序中使用PDO。没有教条说你应该准备所有的代币......这没有任何意义。如果没有任何好处,为什么要使用准备好的声明?这就是为什么 query方法存在。你似乎也暗示通配符被逃脱了 prepare。他们不是。 - Explosion Pills
我不明白你在谈论什么令牌。 ?,? 那些?所以,你会让他们毫无准备或者什么?而且不是我,而是 你是 发表声明 "prepareing a query essentially runs mysql_real_esape_string or some equivalent on each token" 这并非总是如此 - Your Common Sense