我知道您不能在预准备语句中使用数据库或表名作为参数。但是,我们的应用程序允许用户在安装过程中指定数据库名称。有没有一种抽象的或者PDO提供的方法来引用这些名字( MySQL的反号,MSSql的方括号等)?
发布于 2019-02-14 20:00:37
在PDO中不能直接转义列名和表名。你可以在这里看到答案:
在这种情况下,您可以执行一个查询,以便从给定的数据库中获取所有表,如下所示:
SHOW TABLES;或查询以获取所有数据库,如下所示:
SHOW DATABASES;然后将其用作用户输入的白名单。当您使用数据库时,明智的做法是排除一些系统数据库,如mysql本身和information_schema。
另一种选择是使用给定的正则表达式过滤用户输入,例如,如果您的表/数据库名称只是带下划线的字符串,则可以使用:
preg_match('/^[a-z_]+$/i', $userGivenTableName)这应该会删除任何包含SQL注入的潜在字符串。
https://stackoverflow.com/questions/54689839
复制相似问题