sql injection
不,如果您使用第三个参数绑定参数,则该方法不易受到攻击。
此方法createUpdateCommand
从CDbCommandBuilder
类调用,并且此方法将值绑定到准备好的语句,因此您不应该受到 SQL 注入的攻击
没有进行验证。
这意味着它不会根据您可以在模型中创建的验证规则来验证数据。因此,在调用此方法之前,您应该验证来自用户的所有数据是否正确(如果您存储一个 int,则传递的数据是一个 int,字符串少于 255 个字符,...)
由您决定是要调用该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
参数的方法