Laravel 部署只用允许 public/index.php 这一个 PHP 文件可执行?
做了个后台,允许了用户上传任意文件,假设用户上传了 PHP 文件,结果
https://example.com/storage/files/1663937016/EVIL.php
就能执行控制服务器了。
我用的是 Laravel 部署文档给的 Nginx 配置:
server {
listen 80;
listen [::]:80;
server_name example.com;
root /var/www/example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
我的问题是:
- Laravel 是不是只需要 public/index.php 这一个 PHP 文件执行就行了?其他的 PHP 文件均无需发送给 php-fpm 执行
- 如果是的话,如何做到呢?是不是修改
location ~ \.php$ { ...}
这段配置呢?
如果你只希望 index.php 运行的话,那改一下这里也可以。