本文目录导读:

- CSRF 保护(跨站请求伪造)
- XSS 防护(跨站脚本攻击)
- SQL 注入防护
- 密码哈希与安全存储
- 加密(Encryption)
- 中间件安全堆栈
- 认证与会话安全
- 文件上传限制
- 环境配置与调试
- 失败原因与常见误解
- 总结:默认安全得分(满分 5 分:4.5/5)
Laravel 默认开启的安全功能非常全面,涵盖了 Web 应用常见的攻击面,以下是主要默认开启的安全功能及其对应的防护机制:
CSRF 保护(跨站请求伪造)
- 默认状态:全局启用。
- 机制:
VerifyCsrfToken中间件自动为所有POST、PUT、PATCH、DELETE请求验证 CSRF Token。 - 效果:阻止恶意网站诱骗用户执行非本意的操作(如转账、改密)。
- 例外:你需要在
App\Http\Middleware\VerifyCsrfToken的$except数组中显式排除某些路由(如 API 路由或第三方 Webhook)。
XSS 防护(跨站脚本攻击)
- 默认状态:Blade 模板引擎默认启用。
- 机制:使用
{{ $var }}语法时,Laravel 会调用 PHP 的htmlspecialchars()函数自动转义输出的 HTML 标签和特殊字符(<、>、、、&)。 - 效果:防止攻击者注入恶意 JavaScript 代码。
- 注意:如果需要输出原始 HTML(如富文本),必须显式使用
{!! $var !!},但此时需要额外清理(如使用 HTML Purifier 或 DOMPurify)。
SQL 注入防护
- 默认状态:Eloquent ORM 和查询构造器默认启用。
- 机制:
- 参数绑定:所有通过 Eloquent 或 DB Facade 执行的查询,只要使用了参数绑定(如
where('id', $input)或DB::raw('?', [$val])),值都会被 PDO 预处理,不会直接拼接到 SQL 中。 - 原始查询:仅当使用
DB::raw()或whereRaw()且未绑定参数时才存在风险(不推荐)。
- 参数绑定:所有通过 Eloquent 或 DB Facade 执行的查询,只要使用了参数绑定(如
- 效果:阻止攻击者通过输入字段篡改 SQL 语句。
密码哈希与安全存储
- 默认状态:强哈希算法。
- 机制:使用
bcrypt(默认)或argon2(可选,需 PHP 7.2+)算法。Hash::make()会自动生成随机盐(Salt),且计算成本(Cost Factor)可配置。 - 效果:即使数据库泄露,攻击者也很难逆向破解密码(彩虹表攻击几乎无效)。
加密(Encryption)
- 默认状态:可逆加密默认禁用,但框架提供支持。
- 注意:Laravel 不默认加密所有数据,但它提供基于
openssl和AES-256-GCM或AES-256-CBC的加密工具(Crypt::encryptString()和Crypt::decryptString()),项目需要时,开发者需要显式使用。
中间件安全堆栈
- 默认状态:
app/Http/Kernel.php中的全局中间件自动加载。 - 主要中间件:
EncryptCookies:对 Cookie 进行加密,防止用户篡改(如修改remember_token或购物车数据)。AddQueuedCookiesToResponse和StartSession:确保会话管理是服务端安全的。TrimStrings:去除输入字符串首尾空白,避免意外问题。ConvertEmptyStringsToNull:将空字符串转为 null,减少逻辑漏洞。TrustProxies:配合反向代理(如 Nginx 或负载均衡)时,正确获取客户端 IP(防止伪造 IP 头)。
认证与会话安全
- 默认:
web路由组使用基于 Cookie 的会话认证,session驱动默认是file(可在.env中改为database或redis)。 - 防护:Laravel 不默认启用 Session 固定攻击防护,但提供了
regenerate()方法供开发者在登录成功后调用(Breeze 或 Jetstream 会自动处理),生产环境应确认登录后是否调用session()->regenerate()。
文件上传限制
- 默认:
php.ini或 Laravel 验证规则(如mimes、max)由开发者显式设置。 - 注意:Laravel 不默认限制上传文件类型或大小,开发者需要在请求验证中使用
'photo' => 'mimes:jpg,png|max:2048'来显式防护。
环境配置与调试
- 默认:
APP_DEBUG=true在开发环境中默认开启,但在生产环境中必须设置为false。 - 问题:生产环境如果忘记关闭
APP_DEBUG,会暴露数据库凭据、表结构、文件路径等敏感信息。 这不是框架自动关闭的,而是运维责任。 - 推荐:使用
php artisan config:cache固化配置,并确保.env不在 Web 根目录下(默认在项目根目录,一般不在 web 根目录内)。
失败原因与常见误解
- 不默认开启:Laravel 不默认开启 HTTPS 强制跳转(需要借助
URL::forceScheme('https')或 TrustProxies 中间件)。 - 不默认开启:速率限制(
RateLimiter)需要手动配置,仅ThrottleRequests中间件是 Laravel 自带但需显式绑定的。 - 不默认开启:HTTP 严格传输安全(HSTS)头需要手动通过中间件添加。
- 不默认开启安全策略(CSP)头需要手动添加。
默认安全得分(满分 5 分:4.5/5)
Laravel 是 PHP 生态中默认安全性最高的框架之一,只要开发者不主动做以下事情,应用基本安全:
- 不滥用
{!! $var !!}(或者不净化就输出) - 不使用
DB::raw()拼接用户输入 - 不将
.env暴露在公网 - 生产环境关闭
APP_DEBUG - 配置好上传验证规则
如果你正在使用 Laravel Breeze 或 Jetstream 进行认证,它们还额外默认开启了登录失败暂停、邮箱验证(可选)等功能。