【问题标题】:Is the Livewire checksum secure in this scenario在这种情况下 Livewire 校验和是否安全
【发布时间】:2023-02-23 15:50:15
【问题描述】:

我正在构建一个相当大的站点,该站点在很多地方都使用了 Laravel Livewire,包括一些敏感组件,例如帐户更新。

我想确保我没有遗漏任何明显的安全漏洞。

假设我有一个像这样的 Livewire 组件:


class AccountInformation extends Component
{
    /**
     * @var array
     */
    public $form_data = [
        'first_name' => '',
        'last_name' => '',
        'email' => '',
        'telephone' => '',
    ];

    /**
     * @return void
     */
    public function submit()
    {
        $this->validate();

        auth()->user()->update($this->form_data);
    }
}

我们还假设我的 User 模型没有任何属性在模型中受到保护。

Laravel 校验和是否足够安全以确保黑客无法将 'id' 传递到请求中并更新不同用户的帐户?

例如,我可以像这样发送一个 curl 请求:

{
   "fingerprint":{
      "id":"xxxxxxxx",
      "name":"account-form",
      "locale":"en",
      "path":"customer/account-form",
      "method":"GET",
      "v":"acj"
   },
   "serverMemo":{
      "children":[
         
      ],
      "errors":[
         
      ],
      "htmlHash":"1111111",
      "data":{
         "form_data":{
            "id":10000,
            "first_name":"Bob",
            "last_name":"Sith",
            "email":"naughty@hacker.com",
            "telephone":"999"
         }
      },
      "dataMeta":[
         
      ],
      "checksum":"9fa4a09176237dc7224fe5e0d9d9656ccd8c88e4007f17008db000ffbb93f2fd"
   },
   "updates":[
      {
         "type":"callMethod",
         "payload":{
            "id":"jzoh",
            "method":"submit",
            "params":[
               
            ]
         }
      }
   ]
}

所以在上面的请求中,我在 form_data 中添加了一个“ID”字段。在没有任何类型的篡改检查的情况下,这将使用 id 100000 更新用户。

在 Livewire 文档和我的测试中,Livewire 会抛出一个错误,因为表单未通过校验和测试,但我只想绝对确定我不需要做更多的事情来保护 Livewire 组件免受这种“篡改”?

【问题讨论】:

    标签: laravel laravel-livewire


    【解决方案1】:

    Livewire 根据发送到前端的数据创建一个散列,并根据发回的数据创建一个散列。如果有人篡改了前端数据,例如通过更改 ID,散列将不匹配,并且会抛出校验和错误。如果有人添加或删除数据,散列将再次不匹配。

    通过wire:model 处理的数据是单独评估的。有一个鱼子酱。如果用户很聪明,他可能能够找出用于更新用户的属性。在前端更改 wire:model 时,可能允许他们更改您表单中的数据。然而, 这仅有的如果您盲目地使用表单数据更新用户模型是危险的。如果您只使用经过验证的数据,那么您将只会获得您选择要验证的属性。

    $userData = $this->validate();
    auth()->user()->update($userData);
    

    【讨论】:

      猜你喜欢
      • 2014-03-22
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      相关资源
      最近更新 更多