将表名用作php函数的参数是否安全?

将表名用作php函数的参数是否安全?,php,mysql,phpmyadmin,mariadb,Php,Mysql,Phpmyadmin,Mariadb,函数使用SQL搜索名为表的$variable,如下所示: class Search{ `public function query(){` `SELECT * FROM $tableName` `}` } $object = new Search(); $object->query('tableName'); 这是一个好的做法还是通往SQL的大门?简单的回答是不,不要这样做 也就是说,根据参数的来源,它可能是完全安全的 考虑将一个变量映射到表名,这样您

函数使用SQL搜索名为表的$variable,如下所示:

class Search{

    `public function query(){`

      `SELECT * FROM $tableName`

    `}`

}
$object = new Search();
$object->query('tableName');

这是一个好的做法还是通往SQL的大门?

简单的回答是不,不要这样做

也就是说,根据参数的来源,它可能是完全安全的

考虑将一个变量映射到表名,这样您就可以验证是否只使用有效的表名而不是开放式文本生成查询

一个简单的解决方案可以如下所示:

public function query($tableName){
    $allowedTables = ['accounts', 'items', 'products'];

    $table = in_array($tableName, $allowedTables) ? $tableName : null;

    if(empty($table)){
        return false;
    }

    $sql = "Select * FROM " . $table;

    ...
}

您可以通过将允许的表列为白名单,以安全的方式执行此操作。根据您的需要,有许多不同的实现。例如,使用以下内容获取表的完整或筛选列表:

SHOW TABLES; 
顺便说一句,PHP已经成功了。然后检查输入表是否在列表中


我认为这样做是安全的。

这确实是唯一可以动态包含表名的方法,因为标识符不能参数化。在使用它之前,您只需要验证它是一个有效的名称。白名单是一种方法,绝对不安全。但是,您可以根据固定值测试参数,以允许您的函数处理不同的预设表名。如果有很多,请将它们放在ArrayId中,您的查询函数是否将tablename作为参数?在您的示例中,它不是这样写的。避免SQL注入的唯一确定的安全方法是使用预先准备好的语句。您不能绑定表名和列名,但您应该确保将它们列为白名单。这是用什么语言编写的?反刍动物特别令人费解。简短的回答是不,不要这样做。-当下一行开头说它可能是完全安全的时,有点矛盾[…]。所以实际上,简短的回答是这取决于[…]。@Script47 fair point。。。简而言之,这是一个良好的做法吗?没有,但安全吗?也许是吧。即使现在是安全的,以后也很容易忘记风险,并将该变量与用户输入联系起来,或者让其他开发人员不了解风险。谢谢。我有个问题吗?有了这个代码,我可以在任何地方使用它吗?“我想知道这是安全还是依赖于安全?”詹西写道,我的回答不是一个完整的解决方案。您应该添加输入参数的附加验证,尤其是当它来自用户输入或其他不受信任的源时。另外,在执行查询之前,我会确认$table不是空的,并对我的回答进行了适当的编辑,以包括该内容。请您写一个例子好吗?