2017-03-23 4 views
0

この質問は1001回以上尋ねられ、これはnginxとPHPの設定でも可能だと率直に信じられません。私はプロダクションでレガシーアプリケーションを修正する必要があります.nginxとphp-fpmは同じボックスで動作しています。つまり、このディレクトリを共有しています。NGINX:スクリプトファイルのダウンロードを防ぎ、代わりに実行

私の状況は、STATICのようなサイトだけを提供できるという点で、設定の99.999%とは異なります。 2つまたは3つの小さなPHPスクリプトページを読み込むことができます。 明示的なURIがマッチしていない限り、PHPランタイムの実行を許可したくありません。

残念ながら、誰かがサーバー上のphpファイルを '推測'していた場合、ダウンロードします。

Aは私が修正だと思うものを持っている無保持バー

を一時-修正しないブランケット。しかし、私はそれが敏感なサイトであるため、私はこれを検証するよりも、より多くのnginxの経験を持つ人が必要です。私はちょうどblanketly何PHP無視することでこれをしなかった:このブロックがなければ

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

を、nginxのは、ダウンロードとして以下/var/www/cat-videos/cats.phpファイルを送信します!

nginxの

からのダウンロードの根本原因私はnginxのがあるため、ファイルをダウンロードする考え出し(ドラムロール - これがなぜ起こるか誰もEVER EVER説明しなかったように - ドラムロール):

  • nginxの.confはがapplication/octet-stream(別名ダウンロード)に設定されています。これを例えばtext/plainに変更すると、ダウンロードする代わりにPHPが表示されます。このconfig varがその一部であることが証明されています。
  • nginxはタイプに関係なくrootディレクトリからすべてのファイルを提供します。 mime-typeが一致しない場合は、上記のdefault_typeが使用されます。

これがあります。あなたがそれを提供したくなければ、nginxがそれを見ることができる場所にファイルを置かないでください! (代わりに、すべてのphpファイルをrootディレクティブの外の別のディレクトリに移動し、fastcgiが他の場所で話すように設定します)。例えば。 の代わりに/var/www/mysite-scripts-only/です。

NGINXセキュリティベストプラクティス?

これを防ぐためのPHPおよび静的サイトのベストプラクティスは何ですか?スクリプトを別のディレクトリに移動しますか? 2つの異なるサーバーを操作し、proxy_passを使用しますか?

すべてのスクリプトファイル(python、php、rubyなど - すべての種類のすべてのスクリプト)を静的ファイルから完全に分離することをお勧めします。 proxy_passまたはfastcgiまたはpassengerなどの別のディレクトリにスクリプトアクセスを制御できるタイプのディレクティブをlocationに設定します。

これは、静的なサイトからのもので、静的なものであれば、デフォルトでnginxが提供することができます。

そして、いや、私は話ではないのです「だけdownloads`防ぐ必要がありますあなたのlocationおよびFastCGIにXを追加 - 。いいえ、私はこれが再び起こることはありません完全な保証を必要とします。そして、スクリプトファイルを静的ファイルから分離することは、nginxがルートディレクトリにあるすべてのものを提供したいので、これを行う唯一の100%ばかばかしい方法です。

より具体的には、locationオーバーライドまたはURLリライトがあり、すべてのリクエストがnginxでも通過しないようにすることができます。また、rootディレクティブlocationの中に追加して再生することも可能ですが、私が読んだところからは、一般的には眉をひそめます。しかし、この問題を解決するには範囲と時間がありませんでした。ここでは、記録のために

を働い何

は、ダウンロードからPHPを防ぐ私の以前のnginxの設定だった:

  • nginxの1.10
  • のphp-FPMドッキングウィンドウを使用して7.0
  • 、と触れていません/etc/nginx/conf.d/default.conf

以下は、関連する/etc/nginx/nginx.confです。 (conf.d/*を使用していない、問題ではありません)。

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

これは古い設定です。ダイナミックそれを維持したいあなたのものに変更したい場合があり

fastcgi_param SCRIPT_FILENAME /var/www/mysite-scripts-only/cats.php; 

静的ディレクトリからすべてのスクリプトを分離し、他のディレクトリに話をするようにFastCGIのため、私は次のようにしました
# don't use $document_root prefix on the path, move scripts elsewhere 
fastcgi_param SCRIPT_FILENAME /var/www/mysite-scripts-only$fastcgi_script_name; 

ありがとう!

+0

なぜ 'python'タグですか?なぜ 'ルビー'? – leovp

+0

@leovp 'file.py'や' file.rb'をnginxの 'root'ディレクトリに置いて、それが提供されているのが安全であることを期待しているなら、あなたはそうではありません。 'location'がそれにマッチしなければ、それは提供されます。この質問はすべてのconfigsに当てはまります。 – eduncan911

+0

これは 'nginx'の設定上の問題です。これを修正するために 'python' /' ruby​​'コードは必要ありません。 – leovp

答えて

0

私はnginxとこの設定でもっと多くのユーザーと話しましたが、元の質問で説明した以外の方法は実際にはありません。

彼らはは、別のルートディレクトリを使用して静的ファイルからスクリプトを分割すると言っていますは本当に最良の方法です、私はすでにそれを行っています。

したがって、私自身の質問に答えると、実際にはこの時点でWikiになるはずです。

関連する問題