$model->attributes = $_GET[ 'Submission' ];
这看起来对我来说真的很可怕,但它是yii如何为模型分配属性。这是XSS的安全风险吗?它不应该先以某种方式消毒吗?我知道模型得到验证,但它足以恶意输入,特别是如果保存到数据库中,如果你忘了清理输出...yii质量模型属性分配和xss安全问题
$model->attributes = $_GET[ 'Submission' ];
这看起来对我来说真的很可怕,但它是yii如何为模型分配属性。这是XSS的安全风险吗?它不应该先以某种方式消毒吗?我知道模型得到验证,但它足以恶意输入,特别是如果保存到数据库中,如果你忘了清理输出...yii质量模型属性分配和xss安全问题
大规模分配不是默认的“开”。只有通过了一些明确的验证规则的字段才会生效。
$model->attributes = $_GET[ 'Submission' ];
相当于这段代码,
$model->attribute1 = $_GET['Submission']['attribute1'];
$model->attribute2 = $_GET['Submission']['attribute2'];
$model->attribute3 = $_GET['Submission']['attribute3'];
任何XSS,存在于前SQL注入漏洞会出现在以后也;
为了防止XSS,SQL注入,您可以使用捆绑的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字符串之前被验证和大规模的分配方法也适用于所有的四个属性。
这可能是安全的Yii一个像样的文章应用程式http://www.yiiframework.com/wiki/275/how-to-write-secure-yii-applications/
另外,可以使用筛选器和规则或beforeSave()方法筛选模型中的任何输入