【发布时间】:2015-05-08 13:01:07
【问题描述】:
Yii2 支持使用帮助类\yii\helpers\HtmlPurifier 对显示的数据进行 XSS(跨站点脚本)验证,但是这只会像这样验证和清理输出代码
echo HtmlPurifier::process($html);
如何验证输入的 XSS 输入,以使该数据不存储在数据库本身中?
【问题讨论】:
标签: validation activerecord yii xss yii2
Yii2 支持使用帮助类\yii\helpers\HtmlPurifier 对显示的数据进行 XSS(跨站点脚本)验证,但是这只会像这样验证和清理输出代码
echo HtmlPurifier::process($html);
如何验证输入的 XSS 输入,以使该数据不存储在数据库本身中?
【问题讨论】:
标签: validation activerecord yii xss yii2
这可以使用filterValidator 来完成,方法是将进程调用为这样的验证的可调用函数
class MytableModel extends ActiveRecord {
....
public function rules(){
$rules = [
[['field1','field2'],'filter','filter'=>'\yii\helpers\HtmlPurifier::process']
];
return array_merge(parent::rules(),$rules);
}
....
}
field1、field2 等是要验证的输入字段,同样适用于表单模型验证
【讨论】:
'filter' => function($html) { return \yii\helpers\HtmlPurifier::process($html, [ 'Attr.AllowedFrameTargets' => ['_blank'], ]); }
在验证方法之前添加以下内容:
public function beforeValidate()
{
foreach (array_keys($this->getAttributes()) as $attr){
if(!empty($this->$attr)){
$this->$attr = \yii\helpers\HtmlPurifier::process($this->$attr);
}
}
return parent::beforeValidate();// to keep parent validator available
}
如果您想在验证/保存嵌套添加以下行的所有属性之前运行 Xss Validator,它将对您有所帮助
return array_merge(parent::rules(),$rules);
每个类都扩展了新的活动记录
【讨论】:
rules() 更糟糕。
rules() 中期望这样的规则)。您正在处理所有属性,即使这是不必要的(例如对于整数字段)、不需要的(例如应该接受 JavaScript 的 content)或不可能的(例如数组字段)。这是一种“懒惰”的解决方案,从长远来看,弊大于利。