![Nginx、PHP 和 fastcgi_split_path_info 的安全问题](https://linux22.com/image/801150/Nginx%E3%80%81PHP%20%E5%92%8C%20fastcgi_split_path_info%20%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98.png)
答案1
你指的是攻击者可以将任意代码上传到 nginx Web 服务器,然后诱骗服务器将其作为 PHP 执行(该问题没有 CVE,因为从技术上讲,这是一个配置错误,而不是漏洞。)
您列出的任何方法都可以用来补救问题。
解决此问题的另一种更简单的方法是将以下内容添加到您的 PHP 中location
:
try_files $uri =404;
尽管这只有当 nginx 和 PHP 在同一台服务器上运行时才有效,但情况几乎总是如此。
当然,建议您清楚地记录您正在做什么以及为什么这样做。
答案2
在最近版本的 php 中,这不再是一个问题:
来自文件 /etc/php-fpm.d/www.conf:
; Limits the extensions of the main script FPM will allow to parse. This can
; prevent configuration mistakes on the web server side. You should only limit
; FPM to .php extensions to prevent malicious users to use other extensions to
; exectute php code.
; Note: set an empty value to allow all extensions.
; Default Value: .php
;security.limit_extensions = .php .php3 .php4 .php5
答案3
在 Ubuntu 16.04 LTS 服务器上,使用包管理器安装后,nginx
示例 PHPlocation
包括。这是该文件的内容:/etc/nginx/sites-available/default
snippets/fastcgi-php.conf
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
看来,这个问题可以通过使用fastcgi_split_path_info
获取$fastcgi_script_name
和$fastcgi_path_info
。然后try_files
用于查找$fastcgi_script_name
。如果 PHP 文件不存在,则404 Not Found
返回。
我很好奇想知道其他发行版是否实现了这个解决方案。