
直接说结论:Laravel 默认已覆盖 SQL 注入、XSS、CSRF 三大高危漏洞的基础防护,但VerifyCsrfToken、Blade自动转义、Eloquent参数绑定这些机制,只有在“用对方式”时才真正生效——错一处配置或绕过一个环节,防线就可能失效。
CSRF 令牌没生效?先查 VerifyCsrfToken 是否真在 web 中间件组里
很多人以为加了 @csrf 就万事大吉,结果表单提交仍返回 419 错误,或更危险的——API 路由被意外放行。根本原因常是中间件链断裂。
-
app/Http/Kernel.php中确认VerifyCsrfToken::class确实在$middlewareGroups['web']数组里(不是注释掉,也不是被挪到$middleware全局组中) - 检查路由是否真的走
web中间件组:比如Route::post(...)->middleware('web')是冗余的,因为routes/web.php默认已套用web组;而routes/api.php默认不加载该中间件,且不应手动加->middleware('web')——这会引发 session 冲突 -
$except白名单必须最小化:若在VerifyCsrfToken中写protected $except = ['*']或['/api/*'],等于主动关闭保护;只豁免明确需要的 webhook 路径,如'stripe/webhook'
Blade 输出看似安全,但 {!! $html !!} 和 @include($name) 是两个高危缺口
{{ $user_input }} 确实自动转义,但一旦出现 {!! $html !!} 或动态模板名,XSS 风险立刻回归。这不是框架缺陷,而是开发者主动放弃防护。
- 所有富文本内容(如后台编辑器、用户评论)入库前就必须净化,不能等渲染时再处理——API 响应、邮件、缓存都可能暴露原始 HTML
- 避免
@include($template_name),其中$template_name来自请求参数(如request('view'));必须白名单校验:in_array($template_name, ['invoice', 'receipt'], true) - 不要依赖前端 JS 过滤:
v-html渲染的内容若含用户输入,后端未净化则毫无意义;攻击者可绕过 JS 直接调用 API 获取原始字段
SQL 注入防不住?大概率是手写了 DB::raw() 或原生查询
Eloquent 和 Query Builder 几乎不可能触发 SQL 注入,只要你没碰 DB::raw()、whereRaw() 或字符串拼接查询。问题总出在“特殊需求”上。
- 禁止任何形式的字符串拼接:
"SELECT * FROM users WHERE name = '" . $request->input('name') . "'"是红线 -
whereRaw()必须配参数占位符:whereRaw('status = ? AND score > ?', ['active', $min_score]),而非whereRaw("status = '{$status}'") -
DB::select()第二个参数必须是数组:DB::select('SELECT * FROM posts WHERE id = ?', [$id]);漏掉该参数或传字符串,等于打开注入通道
别忽略模型绑定 + 授权检查这个组合拳
隐式路由模型绑定(如 public function show(User $user))能防 ID 篡改导致的 404 泄露,但它不判断“你有没有权限看这个 $user”。越权访问(Insecure Direct Object Reference)常在这里翻车。
- 模型绑定只保证记录存在,不保证属于当前用户;必须叠加授权:
$this->authorize('view', $user)或Gate::allows('view', $user) - 策略(Policy)里别只检查角色,要验证数据归属:
return $user->id === $user->id;这种写法无意义;正确逻辑是return $user->id === $ability->id;或更常见地比对$ability->user_id - 批量操作(如
User::whereIn('id', $ids)->update(...))无法靠模型绑定防护,必须显式校验每个$id是否属于当前用户
最易被忽略的点:CSRF 和 XSS 防护都依赖“上下文一致性”——表单用 @csrf,AJAX 就得配 X-CSRF-TOKEN 头;Blade 用 {{ }} 转义,那 JSON API 返回的数据也得在前端用 v-text 而非 v-html 渲染。安全不是加几个中间件,而是整条链路上没有信任断点。











