Ich sehe diese Frage 1001 mal gestellt und kann ehrlich gesagt nicht glauben, dass dies sogar mit Nginx und einem PHP-Setup möglich ist. Ich muss eine Legacy-App in der Produktion reparieren, nginx und php-fpm laufen auf derselben Box - das heißt, sie teilen dieses Verzeichnis.NGINX: Herunterladen von Skriptdateien verhindern und stattdessen ausführen
Meine Situation ist anders als 99,999% der Setups da draußen, ich erlaube nur eine STATIC-ähnliche Website bedient werden; aber erlauben, dass 2 oder 3 kleine PHP-Skriptseiten geladen werden. Ich möchte keine Ausführung der PHP-Laufzeit erlauben, wenn nicht explizite URIs gefunden wurden.
Leider, wenn jemand eine PHP-Datei auf dem Server "raten" sollte, wird es heruntergeladen!
eine Decke no-holds-bar Temp-fix
Ich habe, was ich denke, eine Lösung ist. Aber ich brauche jemanden mit mehr Nginx-Erfahrung als ich, um dies zu überprüfen, da es eine sensible Seite ist. Ich tat dies, indem nur etwas PHP blanketly ignorieren:
#
# case-insensitive match of anything *.php
location ~* \.php {
# never allow a single .php page to run, ever.
# no parsing, no lookup, nada. stop dead in tracks.
return 404;
}
Ohne diesen Block, nginx unten als Download die /var/www/cat-videos/cats.php Datei sendet!
die Ursache der Downloads von Nginx
ich nginx heraus lädt die Dateien, weil (Trommelwirbel - wie niemand hat jemals jemals erklärt, warum dies geschieht - Trommelwirbel):
- nginx .conf hat
default_type
eingestellt aufapplication/octet-stream
(alias Download). Wenn Sie dies beispielsweise intext/plain
ändern, wird PHP angezeigt, anstatt es herunterzuladen. das beweist, dass diese config var ein Teil davon ist. - nginx liefert alle Dateien aus dem Verzeichnis
root
unabhängig vom Typ. Wenn kein Mime-Typ gefunden wird, wirddefault_type
oben verwendet.
Und da hast du es. Wenn Sie nicht wollen, dass es serviert wird, legen Sie die Dateien nicht dorthin, wo nginx es sehen kann! (Verschieben Sie stattdessen alle PHP-Dateien in ein anderes Verzeichnis außerhalb Ihrer root
-Anweisung, und konfigurieren Sie fastcgi, um an anderer Stelle zu sprechen). Z.B. /var/www/mysite-scripts-only/
anstelle von /var/www/mysite-static-version/
.
NGINX Sicherheits Best Practices?
Was sind die besten Praktiken für php und statische Websites, um dies zu verhindern? Verschieben Sie die Skripts in ein anderes Verzeichnis? Betreiben Sie zwei verschiedene Server und verwenden Sie proxy_pass
?
Ich denke, es ist am besten, alle Skriptdateien (Python, PHP, Ruby, etc - alle Skripte von jedem Typ) vollständig von Ihren statischen Dateien zu trennen. Und setup spezifische location
Direktiven für Typ, wo Sie Skriptzugriff über proxy_pass
oder fastcgi
oder passenger
oder ähnlich in einem anderen Verzeichnis steuern können.
Dies ermöglicht Nginx, standardmäßig von der statischen Website zu dienen, wie es ist, gut statisch.
Und nein, ich spreche nicht über "einfach X zu Ihrem location
hinzufügen und fastcgi sollte Downloads verhindern" - Nein. Ich brauche vollständige Versicherung, dass dies nie wieder passieren wird.Und das Trennen von Skriptdateien von statischen Dateien scheint die einzige 100% idiotensichere Möglichkeit zu sein, dies zu tun, weil nginx nur alles in seinem Wurzelverzeichnis bereitstellen will.
Möglicherweise gibt es genauere location
Überschreibungen oder URL-Umschreibungen, die verhindern, dass alle Anfragen auch in nginx passieren. Es gibt auch die Möglichkeit, mit zusätzlichen root
Direktiven innerhalb vonlocation
zu spielen - aber von dem, was ich lese, ist das im Allgemeinen verpönt. Aber es war außerhalb des Rahmens und der Zeit, um diese Angelegenheit zu lösen.
Was
ArbeiteteFür die Aufzeichnung war hier meine früheren nginx Config, die php verhindert das Herunterladen:
- Nginx 1.10
- php-fpm 7.0
- Mit Docker und nicht berühren die
/etc/nginx/conf.d/default.conf
.
Hier ist der relevante /etc/nginx/nginx.conf
unten. (nicht mit conf.d/*
, spielt keine Rolle).
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip on;
...
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=reverse_cache:60m inactive=90m max_size=1000m;
...
server {
...
# Domain
server_name somerandomurl.blah;
root /var/www/cat-videos;
############################################
# STATIC FILES SECTION
############################################
location/{
index index.html
try_files index.html =404;
}
location /assets/css/ {
}
location ~* .(jpg|png|gif|jpeg|css|txt)$ {
proxy_cache_valid 200 120m;
proxy_cache_lock on;
expires 1d;
access_log off;
}
############################################
# DYNAMIC PHP AREA ** DANGER ZONE **
############################################
#
# case-insensitive match of anything *.php
location ~* \.php {
# never allow a single .php page to run, ever.
# no parsing, no lookup, nada. stop dead in tracks.
return 404;
}
# expose only 1 PHP page.
# NOTE the SCRIPT_FILENAME I am setting manually. This works fine.
# for normal php sites, you'd most likely want to setup clean urls
# and not use the php suffix, and use some of the normal vars you
# see in the 1001+ tutorials out there.
location ~ /process/cat-videos {
include fastcgi_params;
#fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME /var/www/cat-videos/cats.php;
}
Das war die alte Konfig. Ich habe da alle Skripte aus dem statischen Verzeichnis abgetrennt und konfiguriert fastcgi zum anderen Verzeichnis zu sprechen wie:
fastcgi_param SCRIPT_FILENAME /var/www/mysite-scripts-only/cats.php;
Diejenigen von euch wollen es dynamisch zu halten, wollen kann es ändern:
# don't use $document_root prefix on the path, move scripts elsewhere
fastcgi_param SCRIPT_FILENAME /var/www/mysite-scripts-only$fastcgi_script_name;
Vielen Dank!
Warum 'Python'-Tag? Warum 'Rubin'? – leovp
@leovp Wenn Sie 'file.py' oder' file.rb' in Ihrem nginx 'root'-Verzeichnis gespeichert haben und davon ausgehen, dass es sicher ist, dass es nicht angezeigt wird - Sie sind es nicht. Es wird serviert, wenn kein 'Ort' zu ihm passt. Diese Frage gilt für alle Konfigurationen von configs. – eduncan911
Aber das ist 'nginx' Konfigurationsproblem. Kein 'Python' /' Ruby' Code wird benötigt, um dies zu beheben. – leovp