【问题标题】:How can I secure raw sql CDbCriteria condition (anti sql injection) in Yii 1.1?如何在 Yii 1.1 中保护原始 sql CDbCriteria 条件(反 sql 注入)?
【发布时间】:2018-04-26 09:38:34
【问题描述】:

我正在处理一个 Yii 1.1 应用程序。

部分搜索方法使用CDbCriteria 和原始sql。

我想知道如何仍然使用原始 sql 代码并使其免受 sql 注入的影响?

这是一个代码示例:

if (!empty($this->textToSearch)) {
    $text_condition = <<<EOC
(
    topic LIKE "%{$this->textToSearch}%" OR
    main LIKE "%{$this->textToSearch}%" OR  
)
EOC;
    $criteria->addCondition($text_condition);
}

有什么建议吗?

【问题讨论】:

    标签: php sql yii yii1.x


    【解决方案1】:

    您应该使用参数将不受信任的数据传递给查询。注意%_\ chars在SQL查询中有特殊含义,所以也需要转义。

    $criteria = new CDbCriteria();
    if (!empty($this->textToSearch)) {
        $text_condition = <<<EOC
    (
        topic LIKE :text_to_search OR
        main LIKE :text_to_search  
    )
    EOC;
        $criteria->addCondition($text_condition);
        $textToSearch = strtr($this->textToSearch, [
            '%' => '\%',
            '_' => '\_',
            '\\' => '\\\\',
        ]);
        $criteria->params[':text_to_search'] = "%{$textToSearch}%";
    }
    

    【讨论】:

    • 谢谢!还有更多我可以逃脱的 caharcetrs 吗?用 'Yii::app()->db->quoteValue($string)' 转义值呢? 'quoteValue' 可以加入你的反 sql 注入模式解决方案吗?
    • 无需转义更多字符。转义% 与SQLi 无关,它只是防止将% 视为“任何东西”而不是%。参数足以用于 SQLi 保护。 quoteValue() 可以替代使用参数,但无论如何你应该更喜欢参数。
    • 再次感谢!因此,如果我理解正确,只有在“喜欢”上下文中使用参数时,我才应该使用 strtr 来转义字符?例如:我是否需要在这种 sql 语句“blabla.timestamp
    • 是的,它只与LIKENOT LIKE 条件相关。可以看一下CDbCriteria 来源:github.com/yiisoft/yii/blob/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2015-08-20
    • 1970-01-01
    • 2012-10-28
    • 2013-07-07
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多