php-fpm が設定されていない限り、php ファイルを静的に提供しないように Apache を設定する

php-fpm が設定されていない限り、php ファイルを静的に提供しないように Apache を設定する

Apache 2.4 構成セクションがあり、これを使用して、誤って構成された Apache ボックスが PHP ファイルを静的なプレーン テキストとして提供し、資格情報などを失う可能性があるというまれな状況を処理します。

<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    <Files "*.php">
        Require all denied
    </Files>
  </IfModule>
</IfModule>

これらのディレクティブは、php モジュールが存在するかどうかをチェックし、どちらも見つからない場合はページを提供しません。

ただし、centos-8 用の httpd 2.4 の現在のビルドでは、php-fpm が php のハンドラーを構成するデフォルトの方法であり、php のモジュールはロードされません。

<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    # Enable http authorization headers
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    <FilesMatch \.(php|phar)$>
        SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
  </IfModule>
</IfModule>

残念ながら、proxy_fcgi モジュールは httpd によって自動的にロードされるため、php-fpm が設定されているかどうかを示すものとしては役に立ちません。

[root@web httpd]# rpm -q --whatprovides /usr/lib64/httpd/modules/mod_proxy_fcgi.so
httpd-2.4.37-39.module_el8.4.0+778+c970deab.x86_64

によるとドク変数がありますHANDLER:

HANDLER レスポンスを作成するハンドラーの名前

...これは、組み込みハンドラー

default-handler: Send the file using the default_handler(), which is the handler used by default to handle static content. (core)
send-as-is: Send file with HTTP headers as is. (mod_asis)
cgi-script: Treat the file as a CGI script. (mod_cgi)
imap-file: Parse as an imagemap rule file. (mod_imagemap)
server-info: Get the server's configuration information. (mod_info)
server-status: Get the server's status report. (mod_status)
type-map: Parse as a type map file for content negotiation. (mod_negotiation)

しかし、それと一致させようとする私の試みは成功しませんでした。たとえば、これは機能しません:

<FilesMatch \.(php|phar)$>
  <If "%{HANDLER} == 'default-handler'">
    Require all denied
  </If>
</FilesMatch>

ご提案があれば歓迎します。

編集

php-fpm がインストールされた状態で変数 %{HANDLER} の値をダンプしましたが、次のようになりませんでした:

<IfModule headers_module>
    Header  always set X-HANDLER "expr=%{HANDLER}"
</IfModule>

そして次のヘッダーが返されました:

X-HANDLER: text/plain     # no php-fpm

X-HANDLER: proxy:unix:/run/php-fpm/www.sock|fcgi://localhost     # with php-fpm

そこでテストを次のように更新しました:

<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    <If "%{HANDLER} == 'text/plain'">
      <Files "*.php">
          Require all denied
      </Files>
    </If>
  </IfModule>
</IfModule>

しかし、それもうまくいっていない

関連情報