如何使用 Yii 活动记录更新所有方法


how to use yii active record updateall method

如何使用正确更新活动记录中的所有方法?安全吗?我只是这样使用它:

$rows = $this->updateAll($attributes, 'full_path = :path', array(':path' => $path));

但是在这里,文档中写的关于它的内容 http://www.yiiframework.com/doc/api/1.1/CActiveRecord#updateAll-detail:

使用指定条件更新记录。请参阅 find(( 了解详细信息 关于$condition和$params的解释。请注意,属性不是 已检查安全性,未进行验证。

这是否意味着我们容易受到SQL注入的影响?在使用之前我们需要调用验证方法吗?如果使用绑定,使用 CDbCommand 的方法是否比使用 updateAll 更安全?提前感谢您的回答。我希望它们会有用。

不,如果您使用第三个参数绑定参数,该方法不容易受到sql injection攻击。

此方法从类调用CDbCommandBuilder createUpdateCommand,此方法将值绑定到预准备语句,因此您不应该容易受到 SQL 注入的影响

不进行任何验证。

这意味着它不会根据本可以在模型中创建的验证规则验证数据。因此,在调用此方法之前,您应该验证来自用户的所有数据是否都是应有的(如果您存储 int,则传递的数据是 int,字符串少于 255 个 caracters,...

您决定是要调用 validate 方法还是只是确保数据正常

不检查属性以确保安全

这适用于XSS脚本等缺陷,无法控制您存储的文本可能包含某些XSS或其他糟糕的javascript。

更新

属性数组不安全?

属性数组是安全的。当您调用 updateAll 方法时,它将在内部调用 createUpdateCommand 方法CdbCommandBuilder

以下是该方法如何处理参数:

foreach($data as $name=>$value)
{
    if(($column=$table->getColumn($name))!==null)
    {
        //Useless code for the example
        $fields[]=$column->rawName.'='.self::PARAM_PREFIX.$i;
        $values[self::PARAM_PREFIX.$i]=$column->typecast($value);
        $i++;
    }
}
//Some useless code for the example
$sql="UPDATE {$table->rawName} SET ".implode(', ',$fields);
$sql=$this->applyJoin($sql,$criteria->join);
$sql=$this->applyCondition($sql,$criteria->condition);
$sql=$this->applyOrder($sql,$criteria->order);
$sql=$this->applyLimit($sql,$criteria->limit,$criteria->offset);
$command=$this->_connection->createCommand($sql);
$this->bindValues($command,array_merge($values,$criteria->params));

如您所见,对每个参数执行类型转换,以确保其类型应为:$column->typecast($value);

然后它调用参数的bindValues方法

这是否意味着我们容易受到SQL注入的影响?

如果您使用参数而不是查询字符串连接,则不会 - 这就是参数的设计目的。请参阅下面的注释。

在使用之前我们需要调用验证方法吗?

这取决于您是否需要验证模型属性中的值。

如何在不进行验证的情况下使用它的一个示例是,当您想要以编程方式为多个项目切换布尔值时。

如果使用绑定,使用更安全吗?

使用参数与绑定有些相同 - 它也可以防止SQL注入。


注意:

Yii 中的关键字 'safe' 并不是指防止 SQL 注入,而是指当你批量设置/覆盖属性时,属性是否会被复制到模型中。 例如:

$model->attributes = $_POST['MyModel'];

在此处阅读更多内容: http://www.yiiframework.com/wiki/161/understanding-safe-validation-rules/