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

使用Model::unguard()替代$fillable是否安全?

使用Model::unguard()替代$fillable是否安全?

首先得明确Model::unguard()和$fillable的核心区别:

  • $fillable是批量赋值的白名单,明确指定哪些字段允许通过create()、update()等方法批量赋值
  • unguard()是直接关闭Laravel的批量赋值保护,让所有字段都能被批量赋值

关于SQL注入的安全性

不管用$fillable还是unguard(),只要你是通过Eloquent的批量赋值方法操作数据(比如create($data)),Laravel都会自动对参数做绑定转义,不会直接引发SQL注入。这是ORM本身的参数绑定机制在起作用,和批量赋值保护无关。

真正的风险:批量赋值越权

unguard()的最大安全隐患不在SQL注入,而在非法字段赋值。比如你的User模型有is_admin、balance这类敏感字段,当模型处于unguard状态时,如果前端请求中被恶意加入is_admin=1的参数,你要是直接用User::create($request->all()),普通用户会被直接升级成管理员,这属于严重的权限越权问题,完全是业务逻辑层面的安全漏洞。

不建议全局长期开启unguard

如果确实有临时批量赋值的需求,建议临时开启、用完即关,而不是让模型一直处于unguard状态:

// 临时关闭保护
User::unguard();
$user = User::create($safeData);
// 立即恢复保护
User::reguard();

或者用unguarded()闭包更优雅:

$user = User::unguarded(function () use ($safeData) {
    return User::create($safeData);
});

总结

unguard()不能替代$fillable的安全作用——它不会导致SQL注入,但会彻底放开批量赋值的字段限制,带来业务层面的越权风险。除非你能100%确保传入的所有数据都是绝对安全的,否则不要全局保持模型的unguard状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:54:09