保护model-> load()以保存错误输入的最佳方法

时间:2015-12-15 17:31:17

标签: php security model yii2

在yii2应用程序中,我有User模型。例如,我有字段nameis_admin(0或1)。 当用户注册时,他只输入name

他有user/update页面来编辑他的name。但是,如果您是管理员,您还可以编辑每个人页面并设置is_admin字段(对于管理员,它在页面上可见)。

规则如下:

public function rules()
{
    return [
        ['name', 'string'],
        ['is_admin', 'integer'],
    ];
}

:如何通过添加另一个user/update来保护能力用户从<input name="User[...]">页面设置管理员的操作?

这意味着每个人都可以将输入属性name="User[name]"替换为name="User[is_admin]",并将值设置为1。然后$model->load(Yii::$app->request->post())自动设置is_admin var。

是的,我可以在is_admin中手动清空$_POST,但在实际项目中我在db表中有20多个字段并且有很多操作,每次查看我有哪些输入都很难在每个视图中进行比较。

控制器:

$model = User::findIdentity($id);

if ($model->load(Yii::$app->request->post())) {
    if ($model->save())
        ...
}

2 个答案:

答案 0 :(得分:1)

使用scenario。例如:

model

const SCENARIO_USER_SAVE = 'user-save'; // anything you want to call your scenario
public function scenarios()
{
    return [            
        self::SCENARIO_USER_SAVE => ["field1","field2"], // list only the fields you will allow user to update
    ];
}

现在在controller中使用方案

$model = User::findIdentity($id);
$model->scenario = User::SCENARIO_USER_SAVE; // use the scenario

if ($model->load(Yii::$app->request->post())) {
    if ($model->save())
        ...
}

注意,当您执行时,方案中不允许的字段将具有 NULL $model->load(Yii::$app->request->post())无论您通过表单发送什么

更新:在调用$model->save() (我已对其进行测试)时,不会更新/保存场景中不允许的其他字段

详情指南:http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

答案 1 :(得分:1)

在这种情况下,您可以使用ActiveRecord beforeValidate,类似:

class User extends ActiveRecord
{

    public function beforeValidate(){
        //If User Role  is Not Admin $user is User ActiveRecord Object
        if($user->role === 'user'){
            $this->is_admin = 0;
        }
     parent::beforeValidate();
     }
}