Geben Sie alle PHP-Dateien in der Nginx-Konfiguration an, um die PHP-App sicherer zu machen (Nginx).

Geben Sie alle PHP-Dateien in der Nginx-Konfiguration an, um die PHP-App sicherer zu machen (Nginx).

Ich hatte die Idee, ein einfaches Skript zu schreiben, um eine Nginx-Konfigurationsdatei basierend auf einer Reihe von Dateien zu erstellen, die ausgeführt werden dürfen. In meinem Fall wären das .php-Dateien aus einer Anwendung. Das Skript würde einfach einen Nginx-Konfigurationseintrag für jede einzelne .php-Datei in einem Verzeichnis erstellen, in dem sich die .php-Dateien befinden würden.

Meiner Ansicht nach würde die Angabe jeder einzelnen Anwendungsdatei eine unbefugte Ausführung verhindern, und wenn die betreffende Anwendung ganz einfach aus den besagten PHP-Dateien ausgeführt wird, sollte dies in einer Nginx-Konfiguration leicht zu implementieren sein. Vielleicht könnte das Skript auch allgemeine Ratenbegrenzungen für benutzerzugängliche PHP-Dateien und Dateien festlegen, die der Benutzer niemals sehen müsste.

Meiner Meinung nach würde ein ideales Skript eine Konfiguration erstellen, die zumindest auf diesen Eigenschaften basiert:

  • Name der ausführbaren Datei, .php, .py, .pl usw.
  • Ordner müssen nicht direkt zugänglich sein (erstellen aber trotzdem eine Konfiguration basierend auf jeder Datei in diesen Ordnern)
  • Ratelimits pro Ordner oder zumindest für die vom Benutzer verwendeten Dateien

Ich stelle die Frage, um Beweise für ein weiteres Vorgehen zu sammeln, und auch, weil ich nicht ohne weiteres ein Skript finden konnte, das auf die Erstellung einer solchen Konfiguration für Nginx abzielt. (Vielleicht nur, weil es so einfach zu schreiben ist ...). Letztendlich ist das Ziel zusätzliche Sicherheit, und daher suche ich auch nach Meinungen dazu, wie sich eine solche Konfiguration von Nginx darauf auswirken würde und ob es überhaupt eine gute Idee ist.

Antwort1

Ein Webdienst ist in der Regel ein öffentlicher Dienst. Alles (jede Datei), die Sie in IhremWeb-Stammordneroder einen beliebigen Unterordner IhresWeb-Stammordnerist öffentlich. Sie können Ausnahmen von diesem Verhalten in Ihrer Webserverkonfiguration definieren.

Um Dateien, Skripte und Ordner vor öffentlichem Zugriff zu schützen, empfehle ich, sie nicht in oder unterhalb Ihres Web-Stammordners zu speichern.

Wenn Sie diese allgemeinen Regeln befolgen, können Sie einen sicheren Webserver oder Webanwendungsserver erhalten.

Um genauer auf Ihren Fall einzugehen, würde ich empfehlen, (wie Michael Hampton bereits erwähnt hat) nur Ihre index.php (und alle erforderlichen Bilder und öffentlichen JavaScripts) in Ihrem Web-Stammordner zu speichern.

Alle PHP-Klassen, die Sie zum Bereitstellen Ihrer API oder Anwendung benötigen, sollten getrennt von Ihrem Web-Stammordner sowie Ihren Composer-Dateien (normalerweise im Ordner „vendor“ gespeichert) gespeichert werden.

Beispielstruktur:

/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

Für das obige Beispiel würde die folgende Nginx-Konfiguration Ihre Anwendung bereitstellen:

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;
  }
}

verwandte Informationen