Laravel安全配置核心在于运行时隔离:.env仅作初始输入,所有业务代码须通过config()读取;config:cache后env()失效,故敏感值必须预置入config文件;前端仅认MIX_前缀变量;生产环境应避免依赖.env文件,改用PHP-FPM环境注入或KMS动态解密。

直接把敏感信息写进 .env 文件不是终点,而是安全链的第一环;真正出问题的地方,往往发生在读取方式、缓存机制或部署注入环节。
env() 不能在运行时调用,否则返回 null
Laravel 启动初期解析 .env 并填充到 $_ENV,但一旦执行过 php artisan config:cache,后续所有 env() 调用都会失效——不是报错,而是静默返回 null 或默认值。
- 错误写法:
if (env('ENABLE_PAYMENTS')) { ... }—— 部署后永远不进分支 - 正确路径:在
config/services.php中定义'payments_enabled' => env('ENABLE_PAYMENTS', false),再用config('services.payments_enabled') - 控制器、命令、监听器等任何业务代码里,禁止出现
env()
敏感变量必须加 MIX_ 前缀才能进前端
Laravel Mix 默认只识别以 MIX_ 开头的环境变量,并通过 DefinePlugin 注入到构建后的 JS 中。漏加前缀 = 前端完全拿不到;加了但没加 MIX_ = 变量被忽略且无提示。
- 正确示例:
MIX_API_BASE_URL=https://api.example.com→ 前端可访问process.env.MIX_API_BASE_URL - 危险操作:
API_KEY=xxx或REACT_APP_API_KEY=xxx—— Laravel Mix 不处理,也不会报错 - 切勿在
MIX_变量中放数据库密码、JWT 秘钥、APP_KEY等高敏值
生产环境不能依赖 .env 文件存在
服务器上 PHP-FPM 进程不继承 shell 的 export,也不自动读取项目目录下的 .env。如果部署时只靠手动上传 .env,极易因权限、路径或 CI/CD 流水线遗漏导致配置丢失。
- 更稳方案:在 PHP-FPM pool 配置中显式声明,例如
env[DB_PASSWORD] = "your_real_pass" - Docker 用户应使用
env_file:+.dockerignore排除.env,避免镜像打包泄露 - Nginx 的
fastcgi_param方式风险高,可能被日志捕获,不推荐传敏感字段
加密存储连接字符串要绕开 config:cache 陷阱
想对 MONGODB_URI 这类连接串加密再存,不能直接在 config/database.php 里写 Crypt::decrypt(env('MONGODB_ENCRYPTED_URI')) —— 因为 config:cache 会把这行代码序列化成字符串,运行时无法执行函数调用。
- 可行做法:在服务提供者(如
AppServiceProvider)的boot()方法中动态设置连接配置 - 或改用运行时解密 + 连接池管理,避免把解密逻辑塞进配置文件
-
APP_KEY必须保密且不可轮换频繁,否则所有已加密数据将无法解密
最常被跳过的一步是:修改 .env 后忘记运行 php artisan config:clear 再 config:cache,导致新值根本没加载。这个动作不是“可选优化”,而是生效前提。


















