結論(旧版・別ログイン・テスト画面の露出)
旧版・別ログイン・テスト画面の露出とは、サイトのリニューアルや機能追加の後に、古い画面やテスト用の領域が公開されたまま残っている状態です。旧トップページ(index2.html等)、旧ログイン画面(login2.php等)、/test/・/staging/・/backup/などのテスト用やバックアップ用の領域が該当します。更新・保守の対象から外れているため、古いライブラリや修正前のプログラムが動き続け、攻撃の入口になりやすくなります。資産台帳と照合して削除し、必要な環境は公開ドメインから分離するのが対策です。
この記事のポイント
- 旧版は脆弱性修正が適用されていないことが多く、旧ログイン画面は現行の総当たり対策・多要素認証・CSRF対策を欠く場合があります。
- robots.txtは公開ファイルで、RFC 9309もアクセス認可の手段ではないと明記しています。隠したいパスを列挙すると、かえって場所を教えます。
- セキュリティAIチェッカーはHTML・robots.txt・sitemap.xmlに現れるURLから候補を抽出し、200で内容を返せば△と判定します。総当たりの推測はしません。
- 削除前にアクセスログで外部リンクや印刷物・QRコードからの利用を確認し、利用があれば現行ページへ301リダイレクトします。
- 再発防止には、ビルド成果物だけを転送する配備手順と、年1回以上の公開ファイル一覧と資産台帳の照合が有効です。
| 診断項目名 | 旧版・別ログイン・テスト画面の露出 |
|---|---|
| 項目ID | public.legacy-entrypoints |
| 分類 | 公開ファイル・情報露出 |
| 重大度・配点の重み | 中(medium) 重み 2 |
| 関連する標準・ガイドライン | OWASP ASVS 5.0.0 V15.2.3(本番環境は必要な機能だけを含み、テストコード・サンプル・開発用機能を公開しない、L2)、V13.4.7(Web層が配信するファイルを特定の拡張子に限定する、L3)、OWASP WSTG-CONF-04(Review Old Backup and Unreferenced Files for Sensitive Information)、WSTG-INFO-03(Review Webserver Metafiles for Information Leakage)、CWE-200 |
旧版・別ログイン・テスト画面の露出とは
旧版・別ログイン・テスト画面の露出とは、サイトのリニューアルや機能追加を繰り返すうちに、使われなくなった画面やテスト用の領域が公開領域に残り、外部から閲覧できる状態です。
具体的には、旧トップページ(index2.html 等)、旧ログイン画面(login2.php 等)、テスト用ディレクトリ(/test/)、ステージング環境(/staging/)、バックアップ置き場(/backup/)などです。これらは更新・保守の対象から外れているため、古いライブラリや修正前のプログラムが動き続け、攻撃の入口になりやすい資産です。
セキュリティAIチェッカーのこの項目は、サイト自身が公開しているHTML・robots.txt・sitemap.xml に現れるURLから旧版・テスト画面らしい候補を抽出し、実際に内容を返すかを確認します。総当たりのパス推測は行いません。
旧版やテスト画面はなぜ残り、なぜ危険なのか
旧版・テスト画面が残る理由
- リニューアル時に旧ファイルを削除せず、リンクだけを外す(「未参照ファイル」になる)。
- 開発者が動作確認のために
test/を作り、本番へ一緒に配備する。 - 委託先の交代時に資産の引き継ぎが不十分で、誰も存在を把握していない。
robots.txtにDisallow: /test/と書いて検索エンジンから隠したつもりになる。
OWASP WSTG-CONF-04 は、未参照ディレクトリの手がかりとして robots.txt を挙げています。robots.txt は公開ファイルであり、RFC 9309(Robots Exclusion Protocol)も、そのルールはアクセス認可の手段ではないと明記しています。隠したいパスを robots.txt に列挙すると、かえって攻撃者に場所を教えることになります。
旧版が危険な理由
- 旧版のCMS・フレームワーク・JavaScriptライブラリは脆弱性修正が適用されていないことが多い。
- 旧ログイン画面は、現行画面にある総当たり対策・多要素認証・CSRF対策を備えていない場合がある。
- テスト画面は、デバッグ出力、認証の省略、テストデータ(実データの複製を含むことがある)を持つ場合がある。
- 旧版のページが現行と異なるセキュリティヘッダー設定で配信され、保護の抜け穴になる。
関連する診断項目との違い
本診断には、公開ファイル名に .bak・.old・~ を付けた派生名を確認する「旧版・バックアップファイルの露出」もあります。そちらは編集時に残る単一ファイルのバックアップを対象とし、本項目はディレクトリ単位・画面単位で残った旧版やテスト環境を対象とします。両方が △ になる場合は、配備手順そのものに作業ファイルを持ち込む問題がある可能性が高いと考えられます。
CMSの現行の管理画面やインストール画面は「CMSセットアップ/管理入口の露出」で確認します。
旧版・テスト画面についてよくある誤解
- 「リンクしていないから見つからない」:検索エンジンのキャッシュ、Web アーカイブ、
robots.txt、sitemap.xml、HTMLコメント、JavaScript内のURLから容易に見つかります。 - 「Basic 認証をかけたから問題ない」:外部から隔離する手段としては有効ですが、不要な資産は削除するのが原則です。
旧版・別ログイン・テスト画面の露出の診断基準(セキュリティAIチェッカー)
候補の抽出
- トップページと巡回済みの追加ページ(最大2ページ)のHTML本文を連結します。
/robots.txtと/sitemap.xmlをGETし、取得できた本文を加えます(取得失敗は無視)。- 本文中の絶対URLとルート相対パスを抽出し、同一オリジンのURLに正規化します。
- URLが次のいずれかに一致するものを候補とし、重複を除いて先頭2件を使います(HTML本文、robots.txt、sitemap.xml の順に現れたもの。大文字小文字は区別しません)。ただし拡張子が
.css・.js・.png・.jpg/.jpeg・.gif・.svg・.webp・.ico・.woff/.woff2・.pdfの静的ファイルは候補から除きます。
| パターン | 例 |
|---|---|
index + 数字(URL中のどこでも可) | /index2.html、/index_old/index1.php |
login + 数字(URL中のどこでも可) | /login2.php |
/old ディレクトリ(/old/ を含む、または /old で終わる) | /old/、/old |
/test ディレクトリ | /test/、/test/form.html |
/staging ディレクトリ | /staging/ |
/backup ディレクトリ | /backup/ |
到達確認と判定条件
候補へリダイレクトを追わないGETを送り(追加診断のリクエスト予算40件の範囲内)、次のとおり判定します。
| 判定 | 条件 | 得点係数 |
|---|---|---|
| △ 要確認(warn) | 候補のうち1件以上が HTTP 200 で、前後の空白を除いた本文が80文字を超える | 0.45 |
| ○ 問題なし(pass) | 候補がすべて200以外(404、403、401、リダイレクト等)、または本文がほぼ空 | 1 |
| 対象外(na) | HTML・robots・sitemapから候補を1件も発見できない | 計算から除外 |
「× 要改善」は出しません。URL名だけでは「本当に旧版・テスト画面か」「意図した公開か」を判断できないためです。重み2のため、△ の場合は1.1点分の減点です。診断結果の根拠欄には、候補のうち200応答だった件数が表示されます。
判定の限界
- サイト自身が言及していないURL(どこからもリンクされていない旧ファイル)は検出しません。網羅的な確認には資産台帳との照合が必要です。
- 存在しないパスでも200を返すソフト404の構成では、候補が実在しなくても △ になることがあります。その場合は、応答内容がトップページやエラーページかを目視で確認してください。
index2024.htmlや一覧の2ページ目(index2.html)のように、数字付きでも正規の現行ページである場合があります。/css/index2.cssや/img/login1.pngのような画像・CSS・JS・PDF等は候補から除外しますが、.xml・.json・.txtなど除外対象外の拡張子は候補になります。robots.txt・sitemap.xmlが180KBを超える場合は先頭180KBだけを読み、それより後ろに書かれたURLは候補になりません。- 候補の応答が180KBを超える場合は取得失敗として扱い、該当なし(○ 側)になります。
- 確認するのは候補の先頭2件だけです。
自治体サイトでの判定例
| 状況 | 判定 |
|---|---|
robots.txt に Disallow: /test/ があり、/test/ が200で旧デザインのトップページを返す | △ |
sitemap.xml に https://www.example.lg.jp/old/ が残っているが、アクセスすると404 | ○(ただしサイトマップの記載自体も削除が望ましい) |
| 旧版らしいURLがどこにも記載されていない | 対象外(公開サーバーのファイル一覧と資産台帳を照合する手動確認が必要) |
△ になった後の進め方
△ になった場合は、次の順で確認すると効率的です。
- 該当URLをブラウザで開き、現行ページ・旧版・テスト画面・ソフト404のどれかを判別する。
- 旧版・テスト画面であれば、作成者(担当課・委託先)と作成時期をサーバーのファイル更新日時やアクセスログから特定する。
- 個人情報や申請データを含むファイルがないかを確認し、含む場合は情報セキュリティ部門に報告する。
- 削除またはアクセス拒否を行い、再診断で ○ になることを確かめる。
旧版・テスト画面が残っているとどんなリスクがあるか
- 旧ソフトウェアの脆弱性悪用:旧版CMSや古いライブラリの既知脆弱性を突かれ、サーバー上でのコード実行やサイト改ざんに至ります。同じサーバー上の現行サイトにも影響が及びます。
- 認証の迂回:旧ログイン画面が現行と同じ利用者データベースに接続している場合、総当たり対策のない旧画面がパスワード推測の入口になります。
- 個人情報の漏えい:テスト用ディレクトリに、動作確認で使った申請データや住民データの複製、CSVファイルが置かれたままになっていると、URLを知った第三者に取得されます。
- フィッシングへの悪用:放置された旧フォームが改ざんされると、正規ドメイン上の偽フォームとして悪用され、住民が見分けられません。
旧版・別ログイン・テスト画面の対策方法(Apache・nginx・IIS・Next.js)
1. 不要な資産を削除する
- 公開サーバーのドキュメントルートの全ファイル・ディレクトリを一覧化し、資産台帳(現行ページ・システム一覧)と照合します。
- 旧版・テスト・バックアップは公開領域から削除します。保存が必要なものは公開領域外のストレージへ移します。
robots.txt・sitemap.xmlから、存在しないパスや非公開にしたパスの記載を削除します。
2. 残す必要がある場合は公開ドメインから分離する
- ステージング・テスト環境は、別ホスト名(例:
stg.example.lg.jp)で接続元IP制限や認証をかけ、本番ドメインの配下に置かない。 - 一時的に残す場合はアクセスを拒否します。
Apache(.htaccess):
RedirectMatch 404 ^/(old|test|staging|backup)(/|$)
nginx:
location ~ ^/(old|test|staging|backup)(/|$) {
return 404;
}
IIS(web.config、要求フィルターの隠しセグメント):
<system.webServer>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="old" />
<add segment="test" />
<add segment="staging" />
<add segment="backup" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
hiddenSegments は、パスのどの階層でもその名前のセグメントを含むURLを404にします(例:/kurashi/test/ も対象)。正規のページに同名のディレクトリがないことを確認してから設定します。
Next.js(Vercel)では、pages/test や app/test などの開発用ルートをビルド対象から外すか、Proxy(proxy.ts。Next.js 15以前の Middleware)で本番時に404を返します。
3. 再発防止
- 配備手順を「ビルド成果物だけを転送する」方式にし、作業ディレクトリごとのアップロードをやめる。
- 委託契約・検収項目に「本番環境にテスト・旧版ファイルを残さない」を入れる。
- 年1回以上、公開ファイル一覧と資産台帳の照合を行う。
4. 旧版・テスト画面の確認方法
curl -s https://www.example.lg.jp/robots.txt
curl -s https://www.example.lg.jp/sitemap.xml | grep -Eo '<loc>[^<]+' | grep -Ei 'old|test|staging|backup|index[0-9]|login[0-9]'
for p in old/ test/ staging/ backup/ index2.html login2.php; do
printf "%s " "$p"; curl -s -o /dev/null -w "%{http_code}\n" "https://www.example.lg.jp/$p"
done
サイトを壊さないための注意点(ガードレール)
- 削除前に、その旧ページへ外部サイトや印刷物・QRコードからリンクされていないかをアクセスログで確認します。利用があるページは、現行ページへ301リダイレクトしてから削除します。
RedirectMatchのパターンは、/testで始まる正規ページ(例:/testimonials/)を巻き込まないよう、(/|$)で境界を明示します。
よくある質問(FAQ)
リンクを外した旧ページは見つからないのではありませんか?
検索エンジンのキャッシュ、Webアーカイブ、robots.txt、sitemap.xml、HTMLコメント、JavaScript内のURLから容易に見つかります。リンクを外すだけでは「未参照ファイル」になるだけで、公開状態は変わりません。
robots.txtでDisallowにすればテスト環境を隠せますか?
隠せません。robots.txtは誰でも読める公開ファイルで、RFC 9309もそのルールはアクセス認可の手段ではないと明記しています。Disallowに列挙すると、かえって攻撃者に場所を教えることになります。
Basic認証をかけていれば旧版を残してもよいですか?
外部から隔離する手段としては有効ですが、不要な資産は削除するのが原則です。残す必要があるステージング環境は、別ホスト名で接続元IP制限や認証をかけ、本番ドメインの配下に置かないようにします。
旧版・別ログイン・テスト画面の露出が診断で△になったら、どうすればよいですか?
該当URLを開いて現行ページ・旧版・テスト画面・ソフト404のどれかを判別し、旧版なら作成者と作成時期を特定します。個人情報や申請データがあれば情報セキュリティ部門に報告し、削除またはアクセス拒否のうえ再診断します。
index2.htmlのような正規のページでも△になりますか?
なることがあります。一覧の2ページ目などの数字付きURLは正規の現行ページである場合があり、URL名だけでは判断できないため、この項目は×ではなく△にとどめています。目視で確認してください。
.bakや.oldのバックアップファイルは、旧版・別ログイン・テスト画面の露出の項目で確認しますか?
編集時に残る単一ファイルのバックアップは「旧版・バックアップファイルの露出」で確認します。この項目はディレクトリ単位・画面単位で残った旧版やテスト環境が対象です。
旧版・別ログイン・テスト画面の候補URLが見つからない場合は、どう判定されますか?
HTML・robots.txt・sitemap.xmlから候補が見つからなければ対象外(na)です。サイトが言及していない旧ファイルは検出できないため、公開サーバーのファイル一覧と資産台帳を照合する手動確認が必要です。
この項目を含む127項目を、URLを入れるだけで無料診断します。
参考資料
- OWASP ASVS 5.0.0 V15 Secure Coding and Architecture(V15.2.3)
- OWASP ASVS 5.0.0 V13 Configuration(V13.4.7)
- OWASP WSTG-CONF-04 Review Old Backup and Unreferenced Files for Sensitive Information
- OWASP WSTG-INFO-03 Review Webserver Metafiles for Information Leakage
- RFC 9309 Robots Exclusion Protocol
- Apache HTTP Server mod_alias(RedirectMatch)
- nginx ngx_http_core_module(location)
- Microsoft Learn「Hidden Segments <hiddenSegments>」
- Next.js proxy.js(旧 Middleware)