
关于
Laravel 安全最佳实践,涵盖认证/授权、验证、CSRF、批量赋值、文件上传、密钥管理、速率限制和安全部署。
name: laravel-security description: Laravel安全最佳实践,涵盖认证/授权、验证、CSRF、批量赋值、文件上传、密钥管理、速率限制和安全部署。 origin: ECC
Laravel安全最佳实践
为Laravel应用提供全面的安全指导,防范常见漏洞。
何时启用
- 添加认证或授权
- 处理用户输入和文件上传
- 构建新的API端点
- 管理密钥和环境设置
- 加固生产部署
工作原理
- 中间件提供基线保护(通过
VerifyCsrfToken实现CSRF防护,通过SecurityHeaders实现安全头)。 - Guard和策略执行访问控制(
auth:sanctum、$this->authorize、策略中间件)。 - Form Request在输入到达服务层之前进行验证和整形(
UploadInvoiceRequest)。 - 速率限制在认证控制之外添加滥用防护(
RateLimiter::for('login'))。 - 数据安全来自加密转换、批量赋值保护和签名路由(
URL::temporarySignedRoute+signed中间件)。
核心安全设置
- 生产环境
APP_DEBUG=false APP_KEY必须设置,泄露时轮换- 设置
SESSION_SECURE_COOKIE=true和SESSION_SAME_SITE=lax(敏感应用使用strict) - 配置可信代理以正确检测HTTPS
会话和Cookie加固
- 设置
SESSION_HTTP_ONLY=true防止JavaScript访问 - 高风险流程使用
SESSION_SAME_SITE=strict - 登录和权限变更时重新生成会话
认证和令牌
- 使用Laravel Sanctum或Passport进行API认证
- 敏感数据优先使用短期令牌配合刷新流程
- 登出和账户泄露时撤销令牌
路由保护示例:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::middleware('auth:sanctum')->get('/me', function (Request $request) {
return $request->user();
});
密码安全
- 使用
Hash::make()哈希密码,绝不存储明文 - 使用Laravel的密码代理处理重置流程
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules\Password;
$validated = $request->validate([
'password' => ['required', 'string', Password::min(12)->letters()->mixedCase()->numbers()->symbols()],
]);
$user->update(['password' => Hash::make($validated['password'])]);
授权:策略和Gate
- 使用策略进行模型级授权
- 在控制器和服务中执行授权
$this->authorize('update', $project);
使用策略中间件进行路由级执行:
use Illuminate\Support\Facades\Route;
Route::put('/projects/{project}', [ProjectController::class, 'update'])
->middleware(['auth:sanctum', 'can:update,project']);
验证和数据清理
- 始终使用Form Request验证输入
- 使用严格的验证规则和类型检查
- 绝不信任请求负载中的派生字段
批量赋值保护
- 使用
$fillable或$guarded,避免Model::unguard() - 优先使用DTO或显式属性映射
SQL注入防护
- 使用Eloquent或查询构建器参数绑定
- 除非严格必要,避免原始SQL
DB::select('select * from users where email = ?', [$email]);
XSS防护
- Blade默认转义输出(
{{ }}) - 仅对可信的、已清理的HTML使用
{!! !!} - 使用专用库清理富文本
CSRF保护
- 保持
VerifyCsrfToken中间件启用 - 表单中包含
@csrf,SPA请求发送XSRF令牌
SPA使用Sanctum认证时,确保配置有状态请求:
// config/sanctum.php
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost')),
文件上传安全
- 验证文件大小、MIME类型和扩展名
- 尽可能将上传存储在公共路径之外
- 如需要则扫描文件中的恶意软件
final class UploadInvoiceRequest extends FormRequest
{
public function authorize(): bool
{
return (bool) $this->user()?->can('upload-invoice');
}
public function rules(): array
{
return [
'invoice' => ['required', 'file', 'mimes:pdf', 'max:5120'],
];
}
}
$path = $request->file('invoice')->store(
'invoices',
config('filesystems.private_disk', 'local') // set this to a non-public disk
);
速率限制
- 在认证和写入端点应用
throttle中间件 - 对登录、密码重置和OTP使用更严格的限制
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::for('login', function (Request $request) {
return [
Limit::perMinute(5)->by($request->ip()),
Limit::perMinute(5)->by(strtolower((string) $request->input('email'))),
];
});
密钥和凭证
- 绝不将密钥提交到源代码控制
- 使用
.env存储本地密钥,生产环境使用密钥管理器 - 定期轮换密钥和令牌
兼容工具
Claude CodeCursor
标签
安全
