2017-03-23 10 views
0

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 auf application/octet-stream (alias Download). Wenn Sie dies beispielsweise in text/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, wird default_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

Arbeitete

Fü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!

+0

Warum 'Python'-Tag? Warum 'Rubin'? – leovp

+0

@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

+0

Aber das ist 'nginx' Konfigurationsproblem. Kein 'Python' /' Ruby' Code wird benötigt, um dies zu beheben. – leovp

Antwort

0

Ich habe mit viel mehr Benutzern auf Nginx und diesem Setup gesprochen und es scheint nicht wirklich anders zu sein als das, was ich in der ursprünglichen Frage beschrieben habe.

Sie sagten Splitting die Skripte von den statischen Dateien mit verschiedenen Stammverzeichnissen ist wirklich der beste Weg, und das habe ich schon getan.

Daher markiert meine eigene Frage beantwortet, wie es eigentlich ein Wiki an dieser Stelle sein sollte.

Verwandte Themen