【问题标题】:PHP PDO protect database namePHP PDO 保护数据库名称
【发布时间】:2019-02-14 11:55:47
【问题描述】:

我了解您不能在准备好的语句中使用数据库或表名作为参数。但是,我们的应用程序允许用户在安装期间指定数据库名称。是否有抽象或 PDO 提供的方式来引用这些名称(MySQL 的反引号、MSSql 的括号等)?

【问题讨论】:

  • 将它们列入白名单 - 使用数组进行检查,$valid_tables = ["tbl_users", "tbl_posts"]; 然后if (in_array($_POST['table'], $valid_tables))
  • 您的数据库名称是连接的一部分,通常不会是 SQL 的一部分。这可以在 .env 文件或其他配置文件中设置。
  • 没有什么能阻止你做CREATE `$db_name`,只要你健全地检查用户输入,当然还要检查那个 dbname 没有被使用
  • @NigelRen 数据库名称可以在查询中,例如select colname from dbname.tablename.
  • @Barmar - 我知道这就是为什么我说通常不会成为 SQL 的一部分,而不是 不能在 SQL 中

标签: php pdo


【解决方案1】:

您不能直接转义 PDO 中的列名和表名。你可以在这里看到答案:

escaping column name with PDO

在这种情况下,您可以做一个查询以从给定数据库中获取所有表,如下所示:

SHOW TABLES;

或查询以获取所有类似这样的数据库:

SHOW DATABASES;

然后将其用作用户输入的白名单。 使用数据库时,最好排除一些系统数据库,例如 mysql 本身和 information_schema

其他选项是使用给定的正则表达式过滤用户输入,例如,如果您的表/数据库名称只是带有下划线的字符串,您可以使用:

preg_match('/^[a-z_]+$/i', $userGivenTableName)

这应该会删除任何包含 SQL 注入的潜在字符串。

【讨论】:

  • @Xatenev 谢谢,编辑了我的帖子,答案是一样的。
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2012-04-16
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多