【问题标题】:yii mass model attribute assignment and xss security concernsyii 质量模型属性分配和 xss 安全问题
【发布时间】:2014-06-14 11:18:21
【问题描述】:
$model->attributes = $_GET[ 'Submission' ];

这对我来说看起来真的很可怕,但这就是 yii 为模型分配属性的方式。这是 XSS 的安全风险吗?不应该先以某种方式对其进行消毒吗?我知道模型已经过验证,但是恶意输入是否足够,特别是如果保存到数据库并且您忘记清理输出...

【问题讨论】:

    标签: security yii xss


    【解决方案1】:

    Massive assignment 不是默认的 'on' 。它只适用于通过了一些显式验证规则的字段。

    $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' ]; 设置的规则集进行大规模分配

    usernameemail 将被分配,但 first_namelast_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;DR

    1. Yii 为您提供默认的安全功能,大量分配仅在有明确的模型验证规则时才有效
    2. XSS 的发生与是否使用大规模分配无关

    【讨论】:

      【解决方案2】:

      这可能是一篇关于安全 Yii 应用程序的不错文章http://www.yiiframework.com/wiki/275/how-to-write-secure-yii-applications/

      此外,您可以使用模型的过滤器和规则或 beforeSave() 方法过滤任何输入

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        相关资源
        最近更新 更多