You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

该场景下Laravel Livewire校验和是否具备足够安全性?

问题

我正在搭建一个大型网站,多处使用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模型未设置任何guarded属性。请问Laravel校验和是否足以阻止黑客在请求中传入'id'字段来修改其他用户的账户?例如发送包含'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":[
               
            ]
         }
      }
   ]
}

若无篡改校验,这会修改id为10000的用户。根据Livewire文档及我的测试,该请求会因校验和测试失败报错,但我想确认是否还需额外措施来防护此类篡改?

回答

首先,Livewire的校验和机制确实能有效拦截你描述的这类篡改请求——校验和基于组件原始数据生成,篡改form_data里的id字段会导致校验和不匹配,请求会直接被拒绝,无法触发submit方法执行更新操作。

但不能仅依赖校验和作为唯一防护手段,安全防护要遵循纵深防御原则,多一层防护就多一份保障,尤其是涉及用户账户这类敏感操作。建议补充以下措施:

  • 在User模型中明确字段赋值权限
    你的User模型未设置任何guarded属性,意味着所有字段都允许批量赋值修改,这本身就是安全隐患。一旦校验和机制出现意外(比如配置错误),黑客就有机可乘。
    最佳实践是用$fillable指定仅允许修改的字段:

    class User extends Model
    {
        protected $fillable = ['first_name', 'last_name', 'email', 'telephone'];
    }
    

    或者用$guarded禁止敏感字段被批量赋值:

    class User extends Model
    {
        protected $guarded = ['id', 'password', 'created_at', 'updated_at'];
    }
    
  • 在submit方法中显式指定更新字段
    不要直接把整个form_data数组传给update方法,手动提取允许修改的字段,避免意外修改其他字段:

    public function submit()
    {
        $this->validate();
    
        auth()->user()->update([
            'first_name' => $this->form_data['first_name'],
            'last_name' => $this->form_data['last_name'],
            'email' => $this->form_data['email'],
            'telephone' => $this->form_data['telephone'],
        ]);
    }
    
  • 添加表单验证规则
    目前组件仅调用$this->validate()但未定义规则,补充验证规则既能提升用户体验,也能在请求初期过滤非法数据:

    protected function rules()
    {
        return [
            'form_data.first_name' => 'required|string|max:255',
            'form_data.last_name' => 'required|string|max:255',
            'form_data.email' => 'required|email|unique:users,email,' . auth()->id(),
            'form_data.telephone' => 'nullable|string|max:20',
        ];
    }
    

    其中unique规则还能防止用户将邮箱改为已存在的其他用户邮箱,进一步提升安全性。

总结:Livewire的校验和能挡住你描述的篡改请求,但为了绝对安全,必须补充模型层面的字段限制和代码层面的显式字段更新,形成多层防护。

内容的提问来源于stack exchange,提问作者karatecode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:06:40