【发布时间】: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 中。