yii质量模型属性赋值和xss安全性问题

时间:2014-06-14 02:21:28

标签: security yii xss

$model->attributes = $_GET[ 'Submission' ];

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

2 个答案:

答案 0 :(得分:4)

大量分配不是默认' 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_namelast_nameusernameemail在验证之前都已针对XSS,SQL字符串进行了纯化,大量分配也适用于所有四个属性。

Tl; DR

  1. Yii提供默认安全功能,大规模分配仅在有明确的模型验证规则
  2. 时才有效
  3. XSS将独立于是否使用大量分配而发生

答案 1 :(得分:0)

这可能是关于安全Yii应用http://www.yiiframework.com/wiki/275/how-to-write-secure-yii-applications/

的一篇不错的文章

此外,您可以使用过滤器和规则或beforeSave()方法

过滤模型中的任何输入