【问题标题】:Preventing SQL injection with PDO or MySQLi [closed]使用 PDO 或 MySQLi 防止 SQL 注入 [关闭]
【发布时间】:2014-08-18 23:59:59
【问题描述】:

我已阅读以下帖子,并有一些问题:How can I prevent SQL injection in PHP?

我知道您可以在 PDO 和 MySQLi 之间进行选择。有什么区别,我该如何选择?

在示例代码中,他们使用:name 进行 PDO 查询,? 用于 MySQLi。我应该用什么代替它们?只是一个 PHP 变量?

最后,我如何准备开始在我的网站上使用 PDO?有什么我需要安装或添加的吗,或者我可以开始使用示例中提供的相同代码吗?

谢谢

【问题讨论】:

  • 这太宽泛了,而且是多个问题的重复
  • 在示例代码中,:name? 是占位符。您不会用任何东西替换它们......这就是您使用参数化查询的方式。这里的重点是将命令与数据分开。当数据与命令不明确时,可能会发生不好的事情。除此之外,从注入的角度来看,使用哪个 API 并不重要。
  • 您在征求意见,而这些事情显然表明您不知道注射问题的实际情况。你需要真正了解它,而不仅仅是识别流行语。
  • PDO 也可以使用未命名的 ('?') 参数。

标签: php mysql pdo mysqli sql-injection


【解决方案1】:

使用 PDO,您会很高兴的。

在 PHP 5.0 的古代,Mysqli 是 PHP 的一部分,但 PDO 必须与 PECL 分开安装。

自 PHP 5.1 起,PDO 已成为标准 PHP 扩展的一部分。两者都应该在任何现代 PHP 安装中都可用。我听说一些托管公司仍然不启用 PDO,但恕我直言,这表明托管服务提供商没有跟上现代软件的步伐,这是切换到其他托管服务提供商的原因,而不是使用的原因mysqli。

PDO 只有面向对象的用法,而 Mysqli 支持过程和面向对象的用法。

PDO 支持不同品牌的 RDBMS 的多个驱动程序,而 Mysqli 当然只适用于 MySQL。

在某些情况下,在 PDO 中编写代码更简单。例如,如果您正在编写一个通用函数以插入到具有可变列数的任何表中,那么使用 PDO 将参数数组传递给准备好的语句比使用 Mysqli 做的体操更容易。

【讨论】:

    【解决方案2】:

    PDO, mysqli - php 的扩展。他们通常为 php5 安装。如果没有,请阅读:How to install MySQLi

    您可以使用准备好的语句,也可以使用带有转义函数的简单查询(例如 pdo - PDO::quote(),对于 mysqli - mysqli::escape_string())。我正在使用 mysqli 因为我喜欢它。

    对于使用prepared statements,有一个无法破解的答案,我认为:PHP PDO prepared statements

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 2015-05-04
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2011-10-18
      相关资源
      最近更新 更多