laravel生产环境需严格权限控制:仅storage与bootstrap/cache对www-data可写,.env设600权限并移出web根目录;php-fpm应为每个应用独立配置池,启用clear_env=no并禁用危险函数;app_key须安全存储、定期轮换;nginx日志需过滤敏感参数并分路径记录。

Web服务器权限不能交给www-data跑整个Laravel项目
默认用 php artisan serve 或直接把 Laravel 放到 Nginx 的 /var/www/html 下,再用 www-data 用户启动 PHP-FPM,等于让 Web 进程拥有整个项目目录的读写权——一旦某个路由或上传点被利用,攻击者就能写 shell、改 .env、删 storage/logs。
实操建议:
- 把
storage和bootstrap/cache目录设为www-data可写,其余(尤其是app/、config/、.env)只给部署用户(如deploy)读取权限,禁止www-data写入 - Nginx 配置里用
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;,配合realpath_root防路径穿越,别用root+try_files硬拼 -
.env文件权限设为600,且不放在 Web 可访问路径下(比如放到/etc/myapp/.env,然后在bootstrap/app.php里用putenv('APP_ENV='.file_get_contents('/etc/myapp/.env'));加载)
PHP-FPM池隔离不够会导致跨站泄露
多个 Laravel 应用共用一个 www 池,或没配 clear_env = no,就可能让 A 站通过 getenv('DB_PASSWORD') 读到 B 站的环境变量——尤其当它们共享同一个 PHP-FPM master 进程时。
实操建议:
- 每个 Laravel 应用单独开一个 FPM 池(如
/etc/php/8.2/fpm/pool.d/myapp.conf),设置独立的user、group、listen.owner - 在池配置里加
clear_env = no,再显式用env[DB_HOST] = 127.0.0.1注入必要变量,避免继承系统级环境 - 禁用危险函数:在池配置里加
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,dl,pcntl_exec
Laravel自带的APP_KEY泄露会直接导致session和cookie被伪造
很多人把 APP_KEY 提交进 Git、硬编码在部署脚本里,或者用 php artisan key:generate --show 后手动复制——只要这个值被看到一次,攻击者就能解密所有 session、伪造 remember_token、甚至反序列化触发 RCE(取决于用的加密器)。
实操建议:
- 生成后立刻写入
/etc/myapp/.env,并从 Git 忽略该文件;不要在 CI/CD 日志里 echo 它 - 如果用 Envoyer 或 Rocketeer,用
--no-interaction+APP_KEY环境变量注入,而不是在部署脚本里生成 - 定期轮换(比如每次重大发布前),并清空
storage/framework/sessions,否则旧 session 仍可被复用
Nginx日志暴露敏感路径或参数
默认 log_format 会记录完整 $request,包括带 password=xxx 的 POST 查询串、api_token 在 URL 里的请求——这些全进 /var/log/nginx/access.log,运维一查日志就等于看明文凭据。
实操建议:
- 重定义 log_format,用
$request_uri替代$request,去掉 query string;对 POST 请求额外过滤:map $request_method $log_request { ~^(POST|PUT|PATCH) "-"; default $request; } - 在 server 块里加
location ~ ^/api/ { access_log /var/log/nginx/api.log main; },把 API 日志单独切出来,方便后续脱敏处理 - 用
logrotate配置自动压缩 + 删除超过 7 天的日志,避免磁盘打满或历史数据堆积
安全不是加一层防火墙就完事,而是每个环节都在做减法:减少可写目录、减少共享上下文、减少明文暴露、减少日志冗余。最容易被跳过的,其实是 .env 权限和 FPM 池隔离——这两处一松,其他优化基本白搭。











