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

我正在处理Yii 1.1应用程序。</ p>

部分 搜索方法使用 CDbCriteria </ code>和原始sql。 </ p>

我想知道如何仍然使用原始sql代码并使其从sql注入更安全?</ p>

这是一个代码示例:< / p>

  if(!empty($ this-&gt; textToSearch)){
$ text_condition =&lt;&lt;&lt; EOC

topic LIKE“%{$ this-&gt; textToSearch}%“或

主LIKE”%{$ this-&gt; textToSearch}%“或

EOC;
$ criteria-&gt; addCondition($ text_condition);
}
</ code> </ pre>

有任何建议吗?</ p>
</ div>

展开原文

原文

I'm dealing with an Yii 1.1 app.

Part of the search method use CDbCriteria and raw sql.

I was wondering how can I still use the raw sql code and make it more secure from sql injections?

Here is a code example:

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

Any suggestions?

1个回答



您应该使用params将不受信任的数据传递给查询。 请注意,%</ code>, _ </ code>和 \ </ code>字符在SQL查询中具有特殊含义,因此您也需要将其转义。</ p>

  $ criteria = new CDbCriteria(); 
if(!empty($ this-&gt; textToSearch)){
$ text_condition =&lt;&lt;&lt; EOC

:text_to_search或
主要LIKE:text_to_search

EOC;
$ criteria-&gt; addCondition($ text_condition);
$ textToSearch = strtr($ this-&gt; textToSearch,[
'%'=&gt; ;'\%',
'_'=&gt;'\ _',
'\'=&gt;'\\',
]);
$ criteria-&gt; params [' :text_to_search'] =“%{$ textToSearch}%”;
}
</ code> </ pre>
</ div>

展开原文

原文

You should use params to pass untrusted data to query. Note that %, _ and \ chars has special meaning in SQL query, so you need to escape it too.

$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}%";
}

duanpa1980
duanpa1980 是的,它仅与LIKE和NOT LIKE条件相关。 你可以看看CDbCriteria来源:github.com/yiisoft/yii/blob / ...
2 年多之前 回复
drn61317
drn61317 再次感谢! 所以,如果我理解正确,我应该使用strtr转义字符只有当我在'喜欢'contextl中使用参数? 例如:我需要在这种sql语句“blabla.timestamp <:usertimestamp”中逃避字符吗?
2 年多之前 回复
dongyan1625
dongyan1625 无需逃避更多角色。 转义%与SQLi无关,它只是阻止将%视为“任何”而不是%。 参数足以进行SQLi保护。 quoteValue()可以替代使用params,但是你应该更喜欢params。
2 年多之前 回复
dougai6464
dougai6464 谢谢! 我可以逃脱更多的caharcetrs吗? 那么用'Yii :: app() - > db-> quoteValue($ string)'转义值呢? 可以'quoteValue'加入你的反sql注入模式的解决方案?
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问