Tot*_*tor 63 security nginx fastcgi php-fpm
已经有一个 很大 的 谈论关于相对于一个安全问题cgi.fix_pathinfo与Nginx的(通常是PHP-FPM,快速CGI)使用PHP选项。
结果,默认的 nginx 配置文件曾经说:
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
Run Code Online (Sandbox Code Playgroud)
但是,现在,“官方”Nginx wiki声明无需禁用上述 PHP 选项即可正确处理 PATH_INFO。所以呢?
cgi.fix_pathinfo什么的吗?(官方文档只是说:“有关 PATH_INFO 的更多信息,请参阅 CGI 规范”)PATH_INFO和SCRIPT_FILENAME变量做什么?我试图在每一步都理解这个问题。例如,我不明白为什么使用 php-fpm Unix 套接字可以避免这个问题。
use*_*322 90
我将尝试解决您的具体问题,但是您对 PATH_INFO 的误解使问题本身有点错误。
第一个问题应该是“这个路径信息业务是什么?”
路径信息是 URI 中脚本之后的内容(应该以正斜杠开头,但在以 a 开头的查询参数之前结束?)。维基百科关于 CGI 的文章概述部分的最后一段很好地总结了它。下面PATH_INFO是“/THIS/IS/PATH/INFO”:
http://example.com/path/to/script.php/THIS/IS/PATH/INFO?query_args=foo
你的下一个问题应该是:“如何PHP确定什么PATH_INFO和SCRIPT_FILENAME是谁?”
PATH_INFO,所以应该有什么要PATH_INFO被被改写的在SCRIPT_FILENAME其中,是的,在很多情况下被打破。我没有足够旧的 PHP 版本来测试,但我相信它SCRIPT_FILENAME在上面的例子中看到了整个shebang:“/path/to/script.php/THIS/IS/PATH/INFO”(前缀为docroot 像往常一样)。PATH_INFO并SCRIPT_FILENAME获取指向所请求脚本的部分(当然以 docroot 为前缀)。PATH_INFO,他们必须为新功能添加配置设置,以便运行依赖于旧行为的脚本的人可以运行新的 PHP 版本。这就是为什么它甚至有一个配置开关。它应该从一开始就内置(具有“危险”行为)。但是 PHP 如何知道脚本的哪一部分以及它的路径信息是什么?如果 URI 类似于:
http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo
SCRIPT_FILENAME已经确定并PATH_INFO得到其余的。SCRIPT_FILENAME得到 "/foo.jpg" (同样,以 docroot 为前缀)并PATH_INFO获得“/nonexistent.php”。现在应该清楚为什么以及如何危险:
可以构建或配置 Nginx 和 Apache 以防止使用这种技巧的请求,并且有很多示例说明如何做到这一点,包括在user2372674 的回答中。这篇博客文章很好地解释了这个问题,但缺少正确的解决方案。
但是,最好的解决方案是确保正确配置 PHP-FPM,以便它永远不会执行文件,除非它以“.php”结尾。值得注意的是,最近版本的 PHP-FPM(~5.3.9+?)将其作为默认设置,因此这种危险不再是问题。
如果你有一个最新版本的 PHP-FPM (~5.3.9+?),那么你什么都不用做,因为下面的安全行为已经是默认的。
否则,找到 php-fpm 的www.conf文件(也许/etc/php-fpm.d/www.conf,取决于您的系统)。确保你有这个:
security.limit_extensions = .php
Run Code Online (Sandbox Code Playgroud)
同样,这在当今许多地方都是默认设置。
请注意,这并不能阻止攻击者将“.php”文件上传到 WordPress 上传文件夹并使用相同的技术执行该文件。您仍然需要为您的应用程序提供良好的安全性。
Hrv*_*jar 15
本质上,如果没有这个,您可以使用名为“foo.jpg”的 php 代码将文件上传到 Web 服务器;然后像http://domain.tld/foo.jpg/nonexistent.php一样请求它,Web 服务器堆栈会错误地说 oh;这是一个 PHP;我需要处理这个,它会找不到 foo.jpg/nonexistent.php 所以它会回退到 foo.jpg 并将 foo.jpg 作为 php 代码处理。这是危险的,因为它使系统很容易被入侵;例如,任何允许上传图像的网络应用程序都成为上传后门的工具。
关于使用 php-fpm 和 unix socket 来避免它;海事组织它不会解决问题。