前回、下記のような記事を書いたのですが他にも問題がありました。
今回の原因も以前から問題になっているこのブロックです。(本当にこのブロックはさっさと削除した方がいいと思う)
<FilesMatch "(?<!\.gif|\.png|\.jpg|\.jpeg|\.css|\.ico|\.js|\.svg|\.map)$"> SetEnvIf Request_URI "/vendor/" deny_dir Order allow,deny Deny from env=deny_dir Allow from all </FilesMatch>
問題点
最近の Apache では .htaccess のアクセス制限にグローバルコンフィグに下記のような記述がされています。
mod_authz_core
<Files ".ht*"> Require all denied </Files>
しかし、古い Apache もしくは古くから運用してきた Apache では mod_authz_core ではなく mod_access の記述が使われていると思われます。
mod_access (mod_access_compat)
<Files ".ht*"> Order Allow,Deny Deny from all </Files>
この mod_access の記述が使われている場合、問題となっている EC-CUBE の .htaccess 内の記述によってグローバルコンフィグの拒否設定がリセットされます。
- グローバルコンフィグで
Deny from all
される - .htaccess で指定拡張子以外を
Allow from all
していることによって.ht*
が該当しなくなり上記のDeny from all
が無効化される - .htaccess にアクセス制限が外れる
mod_authz_core の記述が使われている場合は mod_access_compat よりあとに mod_authz_core の処理が入るため上書きはされません(内部処理的には一旦 Allow にはなってるんだろうけど最終的に Deny になる)。
確認した範囲では Xserver に設置されている EC-CUBE 4 系で .htaccess にアクセス制限がかからず、ダウンロードが可能でした。
.htaccess に管理画面へのアクセス制限や IP などを色々と書いている場合はそれらの情報が漏れる可能性があります。
対応方法
正直、問題となっている用途不明のブロックを消すのが一番だと思います。あと、いい加減 mod_access の記述(Order
や Deny
等)も辞めるべきだと思います。
他にもいくつか対応方法があります。
既存の拒否リストに追加する
簡単なのは問題のブロックの直下にあるブロックの FilesMatch
のリストに \.ht
を追加します。
<FilesMatch "^\.ht|^composer|^COPYING|^\.env|^\.maintenance|^Procfile|^app\.json|^gulpfile\.js|^package\.json|^package-lock\.json|web\.config|^Dockerfile|^\.editorconfig|\.(ini|lock|dist|git|sh|bak|swp|env|twig|yml|yaml|dockerignore|sample)$"> order allow,deny deny from all </FilesMatch>
グローバルコンフィグの設定を再定義する
問題のあるブロックの下以降で下記を再定義します。
<Files ".ht*"> Require all denied </Files>
RedirectMatch を用いる
RedirectMatch
は mod_access_compat や mod_authz_core よりも後に処理されるためアクセス制限に関わらず 404 Not Found や 403 Forbidden を返却することができます。これは .htaccess のどこに書いても問題ありません。
RedirectMatch 404 /\.ht
上記の対応を行っても問題のブロックを削除しない限り下記の issue に上がっているような問題が残ります。(1 年以上経ってるのに放置…)
これは投稿者の m-pyon23 さんが予想されている通りの動きだと思います。
既存の app
や var
といったディレクトリにも .htaccess は配置されていますがこれは現状 RewriteRule "^app/" - [F]
という mod_rewrite によるアクセス制限が効いているだけで、この行をコメントアウトするとアクセスできてしまいます(サブディレクトリ内の .htaccess の記述 Deny from all
ではなく Require all denied
であればアクセス拒否されます)。mod_rewrite が動いてないと EC-CUBE 自体も動かないのですがその状態だと .htaccess によるアクセス制限も効かないということですね。
一度運用されている環境の .htaccess や拒否設定をしているはずのサブディレクトリが閲覧可能になっていないかどうか確認することをおすすめします。