公開ディレクトリに置いてはいけないファイル
サイトの改修や移転のたびに、データベースの書き出しや設定ファイルの控え、作業メモが公開ディレクトリに残ることがあります。作った本人は「あとで消す」つもりでも、担当が替わり、そのまま数年が過ぎる。ブラウザから URL を直接入力すれば誰でも開けてしまう場所に、それらが置かれ続けている——という状況で読まれることを想定した記事です。
先に結論
- 公開ディレクトリとは、URL を直接叩けば誰でも中身を取得できる場所です。置いた覚えがなくても、置かれていれば取得されます
- 危険度が高いのはデータベースの書き出し (.sql)、設定ファイルの控え (wp-config のコピー)、圧縮したバックアップ、作業ログの 4 種類です。いずれも中身に認証情報か個人情報が入り得ます
- リンクが張られていなくても見つかります。「誰も知らないから安全」は成立しません
- 対処は消すことです。権限設定で隠すより、公開ディレクトリの外へ出すか削除するほうが確実です
公開ディレクトリとは何か
サーバー上にはたくさんのフォルダがありますが、そのうち「ここから下を Web で外部に見せる」と指定された場所が公開ディレクトリです。ドキュメントルートとも呼ばれます。レンタルサーバーでは public_html や www といった名前が使われることが多く、契約によって呼び方が変わります。
この中にあるファイルは、URL の末尾にファイル名を付ければブラウザから取得できるのが原則です。アクセスを制限する設定を別途入れていない限り、置いてある=公開している、と考えて差し支えありません。
WordPress の本体、テーマ、プラグイン、アップロードした画像は、すべてこの公開ディレクトリの中にあります。つまり「Web で見せるためのもの」と「たまたま同じ場所に置いただけのもの」が混ざりやすい構造になっています。作業中に一時ファイルを置く場所として、いちばん手が届きやすいのもここです。
さらに厄介なのは、FTP ソフトやサーバーのファイルマネージャで開くと、公開ディレクトリとその外側が同じ画面に並んで見えることです。境界がどこにあるのかが表示上わかりにくく、置いてよいものと悪いものの区別がつきません。まずは自分のサーバーで、どのフォルダから下が公開範囲なのかを確認してください。
置いてはいけない 4 種類
以下は種類の説明です。特定のサイトで見つかったものを指すものではありません。
データベースの書き出し (.sql / .sql.gz)
移転や改修のとき、データベースの中身をファイルに書き出します。この 1 ファイルの中に、投稿本文だけでなく、利用者アカウント、メールアドレス、パスワードのハッシュ (元のパスワードを復元しにくい形に変換した文字列) が入っています。サイトの中身がまるごと 1 つのファイルになったもの、と考えてください。
設定ファイルの控え (wp-config.php のコピー)
wp-config.php には、データベースの接続情報と認証用のキーが書かれています。この名前のままなら PHP として実行されるので中身は表示されませんが、wp-config.php.bak や wp-config-old.txt のように名前を変えて控えを取ると、PHP として扱われなくなり、中身がそのままブラウザに表示されることがあります。控えを取る行為そのものが公開に変わってしまう、という点が見落とされがちです。
圧縮したバックアップ (.zip / .tar.gz)
サイト一式を固めた圧縮ファイルです。中には上の 2 つが両方入っていることも珍しくありません。圧縮されているから読めない、ということはありません。ダウンロードされれば、相手の手元で普通に展開されます。
作業ログ・引き継ぎメモ・テスト用スクリプト
memo.txt、info.php、test.php といったファイルです。引き継ぎメモには管理画面の URL やアカウントの運用ルールが書かれていることがあります。サーバー情報を表示するためのテスト用ファイルは、PHP のバージョンや読み込まれている機能の一覧を外部に見せます。単体では被害が出なくても、他の情報と組み合わせる材料になります。
「リンクを張っていないから見つからない」は成り立たない
どこからもリンクしていないファイルは誰にも見つからない、という前提は成り立ちません。理由は複数あります。
- ファイル名の当てずっぽうは自動化されています。
backup.zip、db.sql、site.tar.gzのようなよくある名前は、機械的に総当たりで試されます - ディレクトリ一覧表示 (フォルダを開くと中のファイル名が一覧で出る設定) が有効なら、フォルダの URL を開くだけで中身が並びます
- 検索エンジンに拾われる経路はリンクだけではありません。サイトマップ、過去に一度でも参照された URL、外部サービス経由でも到達されます
- 圧縮してあっても保護にはなりません。パスワードを設定していない zip は、ダウンロードされた時点で中身が読まれると考えてください
- 拡張子を
.txtや.bakに変えると、かえってブラウザで開けるようになる場合があります
つまり、名前を複雑にする対処では守れません。「知られていないこと」を防御の中心に置かないのが原則です。
自分のサイトを確認する手順
特別なツールは要りません。FTP かサーバーのファイルマネージャで、公開ディレクトリの直下を開くところから始めます。
- 公開ディレクトリの直下を開き、ファイルとフォルダの一覧を眺めます
- WordPress が標準で置くものを頭に入れます。
wp-admin/wp-includes/wp-content/wp-config.php/index.php/.htaccessなどです。それ以外の見慣れない名前を候補として拾います - 日付が入ったファイル名、末尾が
-old/-bak/-copy/2のもの、担当者の名前や「新」「旧」が入ったフォルダは、特に確認します - 拡張子で絞るなら
.sql.zip.tar.gz.bak.log.txtを優先します - 候補が見つかったら、ブラウザで実際に開けるかを自分で確かめます。開けるなら、外部からも同じように開けます
wp-content/uploadsの中も見ます。ここは書き込みが許可されているため、意図しないファイルが置かれやすい場所です
uploads の中に、画像でもドキュメントでもないファイルが混ざっていた場合は、置いた経緯を確認してください。過去に何が変わったかを追う話は、改ざん検知の警報を全件分類したときの記録で扱っています。
消す前にやること、消し方
見つけたファイルを、その場で削除しないでください。手順は「手元に退避してから、公開ディレクトリから消す」です。
- 対象のファイルを自分の PC にダウンロードして保管します
- 公開ディレクトリから削除します
- サイトの表示と管理画面を、実際に開いて確認します
3 番目が重要です。「使っていないはず」のファイルが、テーマやプラグインから読み込まれていることがあります。消した直後に表示が崩れたり、管理画面が開かなくなったりしたときは、あわてて戻す前にエラーの内容を確認してください。何が読めなくなったのかが分かれば、正しい置き場所に移すだけで済むことがあります。エラーログの場所と読み方を先に押さえておくと、この確認が短く済みます。
権限設定やアクセス制限で隠す方法もあります。ただし、この種の設定はサーバー移転や仕様変更のときに外れます。外れたことに気づく仕組みがないなら、隠す対処は選ばないほうが安全です。公開ディレクトリの外に置くか、削除する。この 2 つが確実です。
バックアップも同じ考え方です。公開ディレクトリの外、あるいはサーバーとは別の場所に保管してください。なお、保管しているだけでは復旧できるとは限りません。取得できることと戻せることは別物で、その違いはバックアップの記事でまとめています。
再発を止める方法は、残念ながら仕組みではなく手順です。作業のたびに「残した一時ファイルを消す」を工程に入れ、人が替わっても残る形で書き留めておく。これ以外に確実な方法はありません。
すでに取得された可能性を考えるとき
ファイルが公開状態で置かれていた期間と、中身に何が含まれていたか。この 2 つで対応の重さが決まります。
データベースの書き出しには、利用者のメールアドレスとパスワードのハッシュが含まれます。問い合わせフォームの送信内容を保存するプラグインを使っていれば、送信された氏名や連絡先も入ります。設定ファイルには、データベースの接続情報と認証用のキー (ソルト) が入ります。流出が疑われるなら、接続情報とキーの両方を変更してください。
そのファイルへのアクセスがあったかどうかは、サーバーのアクセスログで確認できる場合があります。ただし、ログの保存期間を過ぎていれば分かりません。ここで「記録がない」を「アクセスされていない」と読み替えないことが重要です。分からないことは、分からないままで扱ってください。
🚨 個人情報が含まれていた可能性がある場合は、サイト担当者の技術的な判断だけで完結させないでください。組織としての報告経路を確認する必要があります。学校法人や医療機関では、所管の規程で報告の要否と期限が定められていることがあります。
公開ディレクトリに残るファイルの多くは、悪意ではなく作業の途中で生まれます。だからこそ、誰かが意識して消さない限り残り続けます。サイトの中身を一覧で眺める機会を年に一度でも作れば、それだけで見つかるものがあります。
