$model->attributes = $_GET[ 'Submission' ];
这对我来说看起来真的很可怕,但这就是 yii 为模型分配属性的方式。这是 XSS 的安全风险吗?不应该先以某种方式对其进行 sanitizer 吗?我知道模型得到了验证,但是恶意输入是否足够,特别是如果保存到数据库并且忘记清理输出......
最佳答案
大规模分配不是默认的 'on' 。它只适用于通过一些 的字段。显式 验证规则。
$model->attributes = $_GET[ 'Submission' ];
相当于这段代码,
$model->attribute1 = $_GET['Submission']['attribute1'];
$model->attribute2 = $_GET['Submission']['attribute2'];
$model->attribute3 = $_GET['Submission']['attribute3'];
前者出现的任何 XSS、SQL 注入(inject)漏洞也会在以后出现;
为了防止 XSS、SQL 注入(inject),您可以使用捆绑的 CHtmlPurifier类是 HTML Purifier 的包装器过滤器库。 CHtmlPurifier 有多种使用方式,其中一种使用方式是作为模型规则中的过滤器,它将检查 XSS 字符串。
例如,如果您的模型规则功能是这样的
public function rules(){
return array(
array('username, password, salt, email', 'required'),
array('username, password, salt, email', 'length', 'max'=>128),
array('first_name,last_name,username,email','safe','on'=>'search'),
);
}
如果您使用带有
$model->attributes = $_GET[ 'Submission' ];
的规则集的大规模分配username
和 email
但是将被分配 first_name
, last_name
不会分配给模型,因为它们只是 保险箱关于搜索场景。你可以添加一个规则让他们搜索说创建,像这样更新
public function rules(){
return array(
array('username, password, salt, email', 'required'),
array('username, password, salt, email', 'length', 'max'=>128),
array('first_name,last_name','safe','on'=>'create,update'),
array('first_name,last_name,username,email','safe','on'=>'search'),
);
}
这将为大规模任务提供安全保障,但您仍然容易受到 XX 的攻击。为了防止 XSS,您可以使用这种类型的过滤器作为规则
public function rules(){
return array(
array('username, password, salt, email', 'required'),
array('username, password, salt, email', 'length', 'max'=>128),
array('first_name,last_name,username,email','filter'=>array($obj=new CHtmlPurifier(),'purify')),
array('first_name,last_name,username,email','safe','on'=>'search'),
);
}
现在
first_name
, last_name
, username
, email
在验证之前都针对 XSS、SQL 字符串进行了纯化,并且大量分配也适用于所有四个属性。Tl;博士
关于security - yii 质量模型属性分配和 xss 安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24216058/