我想到編寫一個簡單的腳本來基於一組允許運行的檔案建立 Nginx 設定檔。就我而言,它們是應用程式中的 .php 檔案。這個腳本將簡單地為 .php 檔案所在目錄中的每個 .php 檔案建立一個 Nginx 設定條目。
在我看來,指定每個應用程式檔案將禁止未經授權的執行,並且當有問題的應用程式非常簡單地從所述 php 檔案運行時,它應該很容易在 Nginx 配置中實現。也許該腳本還可以理解為用戶可訪問的 php 檔案和用戶永遠不需要看到的檔案設定一般速率限制。
因此,我如何看待理想的腳本,它將至少基於以下屬性建立配置:
- 可執行檔名稱,.php、.py、.pl 等
- 不需要直接存取的資料夾(但仍根據這些資料夾中的每個檔案建立配置)
- 每個資料夾的速率限制,或至少對於面向使用者的文件
我問這個問題是為了收集進一步的證據,而且因為我無法輕易找到一個針對 nginx 創建此類配置的腳本。 (也許只是因為它很容易寫......)。最終的目標是額外的安全性,因此我也在尋求關於 Nginx 的這種配置將如何影響它的意見,以及這是否是一個好主意。
答案1
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;
}
}