在Nginx配置中指定所有php檔案以使所述php應用程式更安全(nginx)

在Nginx配置中指定所有php檔案以使所述php應用程式更安全(nginx)

我想到編寫一個簡單的腳本來基於一組允許運行的檔案建立 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;
  }
}

相關內容