web-dev-qa-db-ja.com

nginx + php7.0-fpmの場合、sites / default / filesディレクトリにある.phpファイルの実行を防ぐ方法は?

Drupal.org記事へのURL 信頼できないPHPの実行防止

デフォルトでは、.htaccess内のsites/default/filesには以下が含まれます。

<IfModule mod_php5.c>
  php_flag engine off
</IfModule>

mod_php7.cバージョンの追加は修正されません。

一時的な解決策は次のとおりです。

ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/drupal"

そして

<FilesMatch \.php$>
   SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

ただし、これらは推奨されておらず、オーバーライド可能です。

Drupal mod_php7.c.htaccessに追加する場合のコアの問題がありますが、Drupal 8の場合のみです(したがって、これはどのように解決されますか? Drupal 7 then?) https://www.drupal.org/node/2455465

Apacheの解決策があります PHPファイルがsites/default/filesディレクトリで実行されないようにするには? ではなくnginxphp7.0-fpm

それで、解決策は何ですか?

(私は実行しています セキュリティレビュー PHPがサイト/デフォルト/ファイル内で実行可能であることを報告するモジュール)

スクリーンショット: enter image description here

権限:

www-data:www-data 755 for dirs / 644 for files

.htaccess:

# Turn off all options we don't need.
Options None
Options +FollowSymLinks

# Set the catch-all handler to prevent scripts from being executed.
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
<Files *>
  # Override the handler again if we're run later in the evaluation list.
  SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
</Files>

# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
  php_flag engine off
</IfModule>

<IfModule mod_php7.c>
  php_flag engine off
</IfModule>

私はnginxとphp7.0-fpmを再起動しました。

5
user3108268

EDIT:Nginxは.htaccessファイルを使用しないため、すべてのディレクティブを/etc/nginx/sites-available/yoursite.tld.vhostファイルに配置する必要があります。 .phpファイルの実行を防ぐには、次のスニペットを配置します。

location ~ \..*/.*\.php$ {
    return 403;
}

location / {
    try_files $uri /index.php?$query_string; 
}

location ~ '\.php$|^/update.php|^/cron.php' {
    fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
    include fastcgi_params;
    # Block httpoxy attacks. See https://httpoxy.org/.
    fastcgi_param HTTP_PROXY "";
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_intercept_errors on;
    fastcgi_read_timeout 180;
    # PHP 7 socket location (change it to fit your config)
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

この正規表現は、/anything/../file.phpに対するリクエストがある場合、403を送信することを意味します。これは、phpファイルが外部からアクセスできることはほとんどないためです(index.phpupdate.php、およびおそらくcron.phpは以下で定義されています)。

すべてをまとめるには、 その完全なnginx vhostの例を参照してください

0
Kojo

これはnginxで機能し、ファイルディレクトリのみを対象としています。

location ~ /files/.*\.php$ {
    return 403;
}

これはより一般的で、ディレクトリ内のどのphpファイルも直接実行できません。

location ~ /.*/.*\.php$ {
    return 403;
}

警告:これはウェブ全体に掲載されていますが、非表示のディレクトリでのみ機能します。

location ~ \..*/.*\.php$ {
    return 403;
}
3
Gerald Melendez

Nginxサイトがそれを行ったことをどのように示すか:

# Block access to scripts in site files directory
location ~ ^/sites/[^/]+/files/.*\.php$ {
    deny all;
}

完全なリファレンスファイルは次のとおりです。
https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/

0
bshea