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ディレクトリで実行されないようにするには? ではなくnginx
とphp7.0-fpm
。
それで、解決策は何ですか?
(私は実行しています セキュリティレビュー PHPがサイト/デフォルト/ファイル内で実行可能であることを報告するモジュール)
権限:
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を再起動しました。
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.php
、update.php
、およびおそらくcron.php
は以下で定義されています)。
すべてをまとめるには、 その完全なnginx vhostの例を参照してください
これはnginxで機能し、ファイルディレクトリのみを対象としています。
location ~ /files/.*\.php$ {
return 403;
}
これはより一般的で、ディレクトリ内のどのphpファイルも直接実行できません。
location ~ /.*/.*\.php$ {
return 403;
}
警告:これはウェブ全体に掲載されていますが、非表示のディレクトリでのみ機能します。
location ~ \..*/.*\.php$ {
return 403;
}
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/