【问题标题】:Yii2 : How to validate XSS (Cross Site Scripting) in form / model input?Yii2:如何在表单/模型输入中验证 XSS(跨站脚本)?
【发布时间】:2015-05-08 13:01:07
【问题描述】:

Yii2 支持使用帮助类\yii\helpers\HtmlPurifier 对显示的数据进行 XSS(跨站点脚本)验证,但是这只会像这样验证和清理输出代码

echo HtmlPurifier::process($html);

如何验证输入的 XSS 输入,以使该数据不存储在数据库本身中?

【问题讨论】:

    标签: validation activerecord yii xss yii2


    【解决方案1】:

    这可以使用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 等是要验证的输入字段,同样适用于表单模型验证

    【讨论】:

    • 好招!到目前为止查看了那个过滤器验证器。我对 html 净化器感到遗憾的是,您不能只问它“此文本是否安全”?我讨厌将文本存储在必须清理的数据库中(表明它可能包含恶意内容)。我宁愿拒绝它,但比较内容不起作用,因为净化器总是修改内容。
    • true,如果您需要拒绝文本,您可以随时使用其他验证库(检查此比较htmlpurifier.org/comparison),可以简单地调用filterValidator中的任何函数
    • 这种情况下如何为 HtmlPurifier 指定配置选项?
    • 我猜是这样的:'filter' => function($html) { return \yii\helpers\HtmlPurifier::process($html, [ 'Attr.AllowedFrameTargets' => ['_blank'], ]); }
    【解决方案2】:

    在验证方法之前添加以下内容:

    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() 更糟糕。
    • @rob006 通过这种方式,您不需要将 array_merge 添加到从自定义 ActiveRecord 扩展的每个类中,您只需将其添加到之前的验证方法中,结果和方法相同。
    • 不。它不太灵活、效率较低且更棘手(您会在rules() 中期望这样的规则)。您正在处理所有属性,即使这是不必要的(例如对于整数字段)、不需要的(例如应该接受 JavaScript 的 content)或不可能的(例如数组字段)。这是一种“懒惰”的解决方案,从长远来看,弊大于利。
    • 但是这样万一将来有人添加了一个文件但没有添加规则,XSS问题将返回,对于整数和日期时间类型字段我们可以忽略它们.
    猜你喜欢
    • 2015-08-15
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多