这个问题与Drupal 和 nginx:一个合理的“通用”配置?
根据我找到的大量示例,我已成功配置了 Nginx。一切运行正常,但我不明白以下 location 指令的作用:
location ~ \..*/.*\.php$ {
return 403;
}
我认为它的作用是防止 .php 文件被访问,但是在哪些情况下我无法弄清楚?
答案1
如果有人请求以 .anything/anything.php 之类的模式结尾的 URL,那么 Nginx 将返回 403。需要澄清的是,在这种情况下,正则表达式仅定义 URL 的结尾,模式前面的内容并不重要。
为什么?不知道。也许你正在使用的应用程序中存在来自这些 URL 的某种风险。
答案2
它并不像描述的那么简单。摘自 nginx 陷阱部分:
在这里,每个以 .php 结尾的请求都将传递到 FastCGI 后端。问题是,如果完整路径没有指向文件系统上的实际文件,默认的 PHP 配置会尝试猜测您要执行哪个文件。
例如,如果请求 /forum/avatar/1232.jpg/file.php 不存在,而 /forum/avatar/1232.jpg 存在,则 PHP 解释器将处理 /forum/avatar/1232.jpg。如果其中包含嵌入的 PHP 代码,则将相应地执行此代码。
因此,以下代码:
location ~* \.php$ {
location ~ \..*/.*\.php$ {return 404;}
...
}
将捕获此信息并在尝试时返回“未找到”响应。
答案3
这看起来像是一次天真的尝试,试图阻止攻击者访问可能放在隐藏目录(即以点开头的目录)中的 PHP 文件。
它会阻止更多目录(任何目录包含一个点)并不能阻止攻击者访问隐藏的 PHP 文件。
如果您确信这不会匹配任何合法的 URI,那么将其保留在那里也没什么坏处。另一方面,这也没有任何好处,因为任何能够将 PHP 文件放在隐藏目录中的攻击者都可以将 PHP 文件放在任何其他目录中。
更好的安全方法是完全阻止攻击者上传 PHP 文件并使用文件完整性系统(例如 AIDE 或 OSSEC)。
我可能误解了它的目的location
,但原作者并没有用评论描述该规则,所以很难确定。
答案4
Shrikeh 是正确的:
location ~* \.php$ { location ~ \..*/.*\.php$ {return 404;} ... }
是一种过滤恶意 URL(如 /forum/avatar/1232.jpg/file.php)的方法,以便如果 file.php 不可用,默认 PHP 配置不会尝试猜测要执行哪个文件。
还有其他方法可以避免同样的情况,https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#passing-uncontrolled-requests-to-php讨论一些。