该场景下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

