According to this post, it was said that if I am using PHP/Nginx, for better security, I should either
cgi.fix_pathinfo = 0
or
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
In other tutorial it recommend the style of
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
Are they contradictive to each others? Any security recommendation?
Thanks.
You're referring to an issue where an attacker can upload arbitrary code to an nginx web server and then trick the server into executing it as PHP. (No CVE exists for this issue as it is technically a misconfiguration rather than a vulnerability.)
Any of the methods you listed can be used to remediate the issue.
Another, simpler way of remediating this issue is to add the following into your PHP
location
:Though this only works if nginx and PHP are running on the same server, which is almost always true.
The recommendation, of course, is that you clearly document what you're doing and why.
In recent versions of php, this is no longer an issue:
From the file /etc/php-fpm.d/www.conf:
On Ubuntu 16.04 LTS Server, after installing
nginx
using the package manager, the example PHPlocation
in/etc/nginx/sites-available/default
includessnippets/fastcgi-php.conf
. This is the contents of that file:It appears that the problem is mitigated by using
fastcgi_split_path_info
to get$fastcgi_script_name
and$fastcgi_path_info
. Thentry_files
is used to look for$fastcgi_script_name
. If the PHP file does not exist, a404 Not Found
is returned.I would be curious to know if this solution is implemented by other distributions.