Php 如何通过Query::select()安全地使用可能不安全的数据?

Php 如何通过Query::select()安全地使用可能不安全的数据?,php,sql,cakephp,select,cakephp-3.0,Php,Sql,Cakephp,Select,Cakephp 3.0,首先,对我的英语感到抱歉! 当我需要更改搜索语句时,我尝试在CakePHP中进行动态选择。我知道可以使用变量来实现这一点,但我考虑的是SQL注入。它还有其他的方法吗 例如: $var = "quantidade";//$var can be other values. $query->find('')->select('quantidade' => $var); 与使用key=>value语法时在Query::where()等其他地方不同,在Query::select()中没

首先,对我的英语感到抱歉! 当我需要更改搜索语句时,我尝试在CakePHP中进行动态选择。我知道可以使用变量来实现这一点,但我考虑的是SQL注入。它还有其他的方法吗

例如:

$var = "quantidade";//$var can be other values.
$query->find('')->select('quantidade' => $var);

与使用
key=>value
语法时在
Query::where()
等其他地方不同,在
Query::select()
中没有SQL注入预防机制,传递给此方法的值会按原样插入到查询中(它们可能会被引用,但不会被转义),所以你必须自己负责保护这个

我建议使用白名单,或者硬编码白名单:

$allowedFields = [
    'field_a',
    'field_b'
];

if (in_array($var, $allowedFields, true)) {
    $query = $Table
        ->find()
        ->select([
            'alias' => $var
        ]);
}
或者从tables架构中检索一个,以防您希望允许所有字段,但是要小心,只有在向用户公开所有可能的列绝对安全的情况下才能这样做

$allowedFields = $Table->getSchema()->columns(); // use schema() in CakePHP < 3.4
$allowedFields=$Table->getSchema()->columns();//在CakePHP<3.4中使用schema()
另见


应该是find('all')或任何其他..cakephp可以处理基本的SQL注入,MVC之美..@fuzzle在
Query::select()中没有SQL注入预防措施。
@ndm I没有具体说明select()@我很困惑,但问题是关于
select()
方法的,因此阅读您的语句的人可能会对它的工作原理产生错误的印象,因此我发表了评论。