Nginx:拒绝在目录及其所有子目录中运行脚本

Hon*_*ger 3 nginx

假设我的网站允许用户创建目录以及上传到名为“/uploads”的目录,如下所示:

/uploads/user_created_folder_1

/uploads/user_created_folder_2

/uploads/user_created_folder_3

... 等等等等

如何防止在“/uploads”及其所有子目录中执行任何潜在的恶意脚本?

服务器块中的以下代码是否正确?

location /uploads/.*.(php|pl|py|jsp|asp|sh|cgi)$ {
                return 403;
                error_page 403 403.html;
        }
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Ale*_*Ten 8

首先,nginx不执行脚本。在某些情况下,它可以将请求代理到其他执行脚本的服务器。最常见的情况是请求中的文件扩展名,典型的 nginx 配置块如下所示:

location ~* \.php$ {
  fastcgi_pass backend;
  ...
}
Run Code Online (Sandbox Code Playgroud)

所以你的问题应该是:如何防止代理请求到文件夹/uploads/?有了这个典型的配置答案就很简单:

location ^~ /uploads/ {
}
Run Code Online (Sandbox Code Playgroud)

这意味着:如果请求文件夹上传,只需将它们作为静态文件提供,不要尝试为它们寻找 regexp 位置(这需要您了解不同类型的 nginx locations)。

如果您的配置与典型配置有很大不同,我们需要查看它才能为您提供正确的答案。

  • 没关系。Nginx 在 regexp 之前检查前缀位置。 (2认同)