如何在Yii 1.1中保护原始sql CDbCriteria条件(反sql注入)?

时间:2018-04-26 09:38:35

标签: php sql yii yii1.x

我正在处理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);
}

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您应该使用params将不受信任的数据传递给查询。请注意,%_\字符在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}%";
}