我想到了一个主意,编写一个简单的脚本,根据一组允许运行的文件创建一个 Nginx 配置文件。在我的例子中,它们是来自应用程序的 .php 文件。该脚本将简单地为目录中的每个 .php 文件创建一个 Nginx 配置条目,.php 文件将位于该目录中。
在我看来,指定每个应用程序文件将禁止未经授权的执行,并且当相关应用程序非常简单地从所述 php 文件运行时,应该很容易在 Nginx 配置中实现。也许脚本也可以理解为设置用户可访问的 php 文件和用户永远不需要看到的文件的一般速率限制。
因此,我认为理想的脚本是至少根据以下属性创建配置:
- 可执行文件名称,.php、.py、.pl 等
- 文件夹不需要直接访问(但仍然根据这些文件夹中的每个文件创建配置)
- 每个文件夹的速率限制,或者至少针对用户面临的文件
我问这个问题是为了收集进一步研究的证据,也是因为我找不到一个可以针对 nginx 进行此类配置创建的脚本。(可能只是因为它很容易编写……)。最终目标是额外的安全性,因此我也在寻求有关 Nginx 的此类配置将如何影响它的意见,以及这是否是一个好主意。
答案1
Web 服务通常是一种公共服务。您存储在 Web 服务中的所有内容(每个文件)网站根文件夹或您的任何子文件夹网站根文件夹是公开的。您可以在 Web 服务器配置中定义此行为的例外情况。
为了保护文件、脚本和文件夹不被公众访问,我建议不要将它们存储在 Web 根文件夹中或之下。
遵循这些通用规则是获取安全的 Web 服务器或 Web 应用程序服务器的好方法。
为了更具体地了解您的情况,我建议仅将您的 index.php(以及所有必需的图像和公共 JavaScript)存储在您的 Web 根文件夹中(正如 Michael Hampton 已经提到的)。
您需要提供给 API 或应用程序的所有 PHP 类都应与您的 Web 根文件夹以及 Composer 文件(通常存储在“vendor”文件夹中)分开存储。
示例结构:
/project_root
/htdocs (web root folder)
index.php
favicon.ico
robots.txt
/images
logo.png
background.png
/javascript
script.js
/src
/php
/api
/controller
/overview
get.php
/login
get.php
put.php
delete.php
post.php
/javascript
base.js
/reload
plugin.js
/vendor
autoload.php
对于上面的例子,下面的 Nginx 配置将为你的应用程序提供:
server {
...
# take care to deliver public static content if file exists
# or execute /index.php if not
location / {
try_files $uri /index.php;
}
...
# do not execute /index.php if requested image or JavaScript does not exists
location ~ ^/(images|javascript)/ {
try_files $uri =404;
}
...
# execute PHP files
location ~ \.php$ {
try_files $uri /index.php;
include fastcgi_params;
fastcgi_keep_conn on;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}