この質問は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;
ありがとう!
なぜ 'python'タグですか?なぜ 'ルビー'? – leovp
@leovp 'file.py'や' file.rb'をnginxの 'root'ディレクトリに置いて、それが提供されているのが安全であることを期待しているなら、あなたはそうではありません。 'location'がそれにマッチしなければ、それは提供されます。この質問はすべてのconfigsに当てはまります。 – eduncan911
これは 'nginx'の設定上の問題です。これを修正するために 'python' /' ruby'コードは必要ありません。 – leovp