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