【问题标题】:MySQL prepare vs PHP mysqli prepareMySQL 准备与 PHP mysqli 准备
【发布时间】:2012-06-19 12:32:43
【问题描述】:

我想知道 MySQL PREPARE/EXECUTE 子句和 PHP mysqli 准备/执行方法之间是否有任何区别?预防注射是好是坏?

我很好奇,因为我正在编写一些数据库存储过程,其中一个,表和属性在编译时是未知的。我可以将数据写成静态的,但是查询有点复杂,它只会用大量的控制逻辑使过程膨胀。但这让我开始思考这个问题,我只是想知道,当我只需要一个简单的语句时,我用动态 SQL 编写一个简短的过程还是只用 PHP 进行准备和绑定。

如果这是重复,我也很抱歉,当然欢迎链接到已回答的 SO 问题。但是,我一般在 google 上查看,并没有找到太多具体的答案。

【问题讨论】:

  • 你试过the MySQL manual吗?它明确指出PREPARE/EXECUTE 语句是同一种准备机制的接口,但效率低于应用程序端的准备语句。
  • PHP 手册并没有真正回答我遇到的注入问题,MySQL 手册也没有。

标签: php mysql mysqli


【解决方案1】:

PHP mysqli 是一个层,在 PHP 中,围绕 MySQL 的准备/执行功能。

只要将来自用户的所有内容都填充到绑定变量中,两者都会保护您免受 SQL 注入的影响。

准备好的语句,无论以哪种方式处理,都可以提高大容量操作的效率。在 MySQL 中,与 Oracle 等高价 DBMS 相比,效率提升不大,但仍然值得付出一切。

如果您需要在应用程序中将表名作为“变量”,那没关系,但您不能将表名视为绑定变量。因此,您需要对导致构建这些表名的任何用户输入完全偏执。

【讨论】:

  • 嗯,有道理。因此,由于 mysqli 层只是常规 MySQL 的包装器,因此它们的行为方式基本相同。谢谢!我没有直接使用表名,因为它们对于用户输入来说不是很合乎逻辑。相反,我使用了一个对用户来说更清晰的东西,比如“表名”,然后我将其解析为表的实际名称,比如“tableName”(因为我喜欢我的 CamalCase)。
  • 对。只要确保你友好的本地用户不能给你一个像“;DROP TABLES”这样的表名!
  • 嗯,我认为从进一步阅读来看,这将是无效的,对吧?我记得一个文档或常见问题解答说执行(在任何一种情况下)仅适用于一个语句。使用“; drop tables --”,这会将查询变成两个语句,因此不应该按照我的理解执行。
  • 希望它是无效的。但是您仍然应该确保表名和其他从用户提供的输入派生的非绑定变量参数经过严格的清理。说真的,不要在这里走任何捷径。做对了!请!
【解决方案2】:

当我在 2020 年回答这个问题时,我了解到你应该使用 PDO 来准备和绑定或绑定内部执行,而不是使用 mysqli。不会被注射,更安全。

【讨论】:

  • mysqli 准备有什么问题?剧透:没有错,它和 PDO 一样安全
  • 它们同样安全。您应该考虑使用 PDO 而不是 MySQLi 的其他原因
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2010-11-17
  • 2011-06-20
相关资源
最近更新 更多