Nginx、PHP 和 fastcgi_split_path_info 的安全问题

Nginx、PHP 和 fastcgi_split_path_info 的安全问题

根据这个帖子据说,如果我使用 PHP/Nginx,为了获得更好的安全性,我应该

cgi.fix_pathinfo = 0

或者

if ( $fastcgi_script_name ~ \..*\/.*php ) {
  return 403;
}

其他教程它推荐的风格

fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;

它们是否互相矛盾?有什么安全建议吗?

谢谢。

答案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/defaultsnippets/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返回。

我很好奇想知道其他发行版是否实现了这个解决方案。

相关内容