【问题标题】:Is User::create() safe in Laravel?User::create() 在 Laravel 中安全吗?
【发布时间】:2014-01-02 08:13:07
【问题描述】:

我正在尝试使我的 Laravel UserController 尽可能精简,而不使用任何额外的软件包,比如 Ardent(我觉得这没有必要;矫枉过正。)

这是我的postRegister()函数,当用户在注册表单上点击“提交”时被路由到的函数。

public function postRegister() {
    $validator = new Services\Validators\RUser;
    if ($validator->passes()) {
        User::create(Input::all());
        return Redirect::to('login');
    }
    return Redirect::to('register')->withInput()->withErrors($validator->getErrors());
}

我将所有输入发送到另一个类中进行验证,然后我只是使用User::create() 静态调用该类。我想知道这是否安全。除了idpassword_confirmation 之外,我什么都有,而且密码在一个mutator 函数中被散列。

如果这不是处理用户创建的安全方法,我应该怎么做?我应该改为创建对象的实例并手动分配值吗?提前致谢。

【问题讨论】:

    标签: php laravel user-input mass-assignment


    【解决方案1】:

    基本上,Model::Create 函数执行以下步骤:

    1. 实例化一个新的模型实例
    2. 使用输入数组,如果可用,使用 set-mutators 填充所有未保护/可填充的模型属性
    3. 将模型保存到数据库
    4. 返回模型

    因此,只要您将不想被大量分配的字段添加到 $guarded 数组(或将它们从 $fillable 数组中排除),就不应该有任何安全风险。功能与逐步构建模型然后保存它的功能大致相同。

    作为建议:输入验证应在“保存”或“创建”事件期间在模型内进行。如果您在其中一个事件期间返回 false,您将停止模型创建。

    【讨论】:

    • 感谢您的信息!根据您的建议,我该怎么做呢?我应该调用 User::create() 函数,然后在模型内部做一些事情吗?不知道我会怎么做。
    • 基本上在调用 Save 方法时,会依次触发以下事件:Saving > Creating or Updating > Created or Updated > Saved。在模型中填充属性后,Create 函数调用 Save。您可以在文档中看到如何完成此操作的示例:laravel.com/docs/eloquent#model-events。附带说明一下,无论模型是否保存到数据库,Create 函数都会返回模型。因此,要执行条件重定向,您可能希望避免它并自己调用 Save 以便检查返回布尔值。很多选择。
    • 哦,好的。感谢您提供该链接,我知道我现在可以如何使用它了。
    • 如果你想减少通过哪个 Input get (而不是Input::all()),你可以使用Input::only()。示例:Input::only(array('username', 'password', 'email')).
    【解决方案2】:

    只要您只使用您希望批量分配的值填充模型$fillable 数组,这是安全的。验证所有 $fillable 值,然后添加您所询问的安全防护。

    这确保只有$fillable 中的值会被填充到模型中,而忽略任何其他输入。

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多