【问题标题】:How to safely use possibly unsafe data with Query::select()?如何通过 Query::select() 安全地使用可能不安全的数据?
【发布时间】:2017-12-06 12:24:31
【问题描述】:

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

例子:

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

【问题讨论】:

  • 应该是 find('all') 或任何其他 ..
  • cakephp 可以处理基本的SQL注入,MVC之美..
  • @Confused Query::select()没有SQL注入预防!!
  • @ndm 我没有具体说明 select() 。 book.cakephp.org/3.0/en/orm/…
  • @Confused 但问题是关于select() 方法,因此阅读您的声明的人可能会对它的工作方式产生错误的印象,因此我的评论。

标签: php sql cakephp select cakephp-3.0


【解决方案1】:

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

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多