我知道您不能在准备好的语句中使用数据库或表名作为参数。但是,我们的应用程序允许用户在安装过程中指定数据库名称。是否有抽象或PDO提供的方式来引用这些名称(MySQL的反引号,MSSql的括号等)?
答案 0 :(得分:0)
您不能直接在PDO中转义列名和表名。您可以在这里看到答案:
在这种情况下,您可以做的是查询以从给定数据库中获取所有表,如下所示:
SHOW TABLES;
或查询以获取所有像这样的数据库:
SHOW DATABASES;
然后将其用作用户输入的白名单。
使用数据库时,最好排除一些系统数据库,例如mysql
本身和information_schema
。
其他选项是使用给定的正则表达式过滤用户输入,例如,如果表/数据库名称仅是带下划线的字符串,则可以使用:
preg_match('/^[a-z_]+$/i', $userGivenTableName)
这应该删除所有包含SQL注入的潜在字符串。