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

时间:2017-12-06 12:24:31

标签: php sql cakephp select cakephp-3.0

首先,对不起我的英语! 当我需要更改搜索语句时,我尝试在CakePHP中进行动态选择。我知道可以使用变量来做到这一点,但我想到SQL注入。还有其他办法吗?

示例:

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

1 个答案:

答案 0 :(得分:0)

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

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

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

if (in_array($var, $allowedFields, true)) {
    $query = $Table
        ->find()
        ->select([
            'alias' => $var
        ]);
}

或从表架构中检索到的,如果您想要允许所有字段,但小心,只有在将所有可能的列公开给用户绝对安全时才执行此操作!

$allowedFields = $Table->getSchema()->columns(); // use schema() in CakePHP < 3.4

另见