我一直在 PDO 中使用准备好的语句,我发现表名无法绑定(bind)。虽然我可以使用类似 $sql = "select * from $table_name where some = :something"
如果 $table_name 变量是通过运行查询并从数据库获取值的方法在内部分配的,那么此方法安全吗?或者使用变量表名是不好的做法吗?如果是基于意见,我想知道您的意见。
最佳答案
在某些情况下,您必须使用动态表名称,因此这是可以接受的做法。就我个人而言,我会仔细检查此要求是否是必须的,如果不是,则对查询中的表名称进行硬编码。
如果表名来自用户输入,那么我将使用白名单作为安全措施:从 mysql 的 information_schema 获取表名列表,并将它们与应用程序代码中的输入进行比较避免任何 aql 注入(inject)。
如果表名来自mysql的information_schema,那么就是这样,您可以使用它而无需任何进一步的检查,因为它是一个有效的表名。只需在名称周围加上反引号即可。
如果表名称来自应用程序创建的表,那么我将再次通过 information_schema 检索表列表并检查它是否存在于应用程序代码中。这可确保表名有效。
关于php - 表名作为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43625304/