公開ディレクトリのバックアップはソースの流出
大きなファイルをいじる前に、まず複製を取るのは自然な動きです。cp index.php index.php.変更前、それから作業。そのファイルがウェブサーバーの公開するディレクトリにあるなら、あなたはたった今、ソースコード一式を平文でダウンロードできる状態にしました — データベースの資格情報も、秘密も、そのファイルにたまたま入っているすべてを。
Apache が index.php を PHP に通すのは、.php で終わっているからです。index.php.変更前 は .php で終わっていません。.変更前 で終わっていて、Apache はそんな拡張子を聞いたことがないので、既定の動作をします。バイトをそのまま送るのです。
たいていの人が書く規則と、それでは足りない理由
よくある守りは拡張子の禁止一覧です。.bak、.orig、.save、.sql、.old。思いついたファイルは捕まえます。ここで試したところ、その一覧は probe.bak には正しく答え、次のどれにも間違えました。
index.php.vor-xyz— 実際にこう起きたindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
すべて 200 で配信されました。あなたが思いつかなかった命名こそ、あなたが実際に使う命名です。バックアップの名前は、そのとき何をしていたかで付けるからです。
切り口をひっくり返す
うまくいく規則は、どの拡張子が禁止かを問いません。構造について問います。このファイル名は、末尾ではない位置にソースの拡張子を含んでいるか?
含んでいるなら、それは実行されるはずだったものの複製です。後ろに付いた接尾辞が何と言おうと関係ありません。index.php.なんでも は一致します。style.css.なんでも も一致します。この形は、まだ誰も思いついていない名前まで覆います。そこがすべての要点です。
本日、稼働中のサーバーに対して確認しました。上の五つの名前はいまどれも 403 を返します。存在しないものも含めて — この規則が拒むのは形であって、ファイルではありません。
例外と、それが教えること
ここで正当なファイル名が一つ、ちょうどその形をしています。事前圧縮された資産は style.css.1787777226.gz と書かれ、拡張子が真ん中にあるのは設計のうちです。そこで規則は、数字の区間に .gz が続く場合という狭い例外を一つだけ持ち、このファイルは期待どおり 200 を返します。
この種の規則がたいてい崩れるのは、まさにそういう例外のところです。だからこの例外を安全にしているものを言っておく価値があります。index.php.なにか.gz を組み立ててソースを取り戻すことができない程度に狭い — 真ん中の区間は数字だけでなければならないからです。もっと広い例外 —「.gz で終わるものすべて」— なら、規則を丸ごと明け渡していたでしょう。
そして、いちばん単純な助言は、これらすべてを不要にするものです。バックアップは公開ディレクトリの外に置くこと。規則は忘れた日のための網であって、複製がどこに落ちるかを気にしなくてよくなる免許ではありません。