Webサイトを運用していると、「特定のディレクトリだけにBasic認証をかけたつもりなのに、別の場所でも認証がかかってしまう」という現象に遭遇することがあります。
この原因の多くは、HTML本体ではなく、ページ内で読み込まれるCSS、JavaScript、画像などのリソースにBasic認証がかかっていることにあります。
本記事では、どのリソースにBasic認証がかかっているのかを調べる方法を、コマンドベースで分かりやすく解説します。
調査対象の例
https://example-site.com/sample-page
ステップ1:リソースURLを抽出する
まずは、HTMLページから<img>
、<link>
、<script>
などに含まれるURLを抽出します。
curl -s https://example-site.com/sample-page \
| grep -Eo 'src="[^"]+"|href="[^"]+"' \
| sed 's/src=//;s/href=//;s/"//g' > urls.txt
コマンドの説明:
curl -s
: ページのHTMLソースを取得(-s
は進捗非表示)grep -Eo
:src="..."
やhref="..."
を抽出sed
:src=
やhref=
、ダブルクオートを除去> urls.txt
: 結果をurls.txt
に保存
この時点で、相対パスも含めたURLの一覧がファイルに記録されます。
ステップ2:相対パスを絶対URLに変換する
抽出されたURLの中には、/wp-content/...
のような相対パスが含まれている場合があります。これを絶対URLに変換します。
awk '!/^https?:\/\// {print "https://example-site.com" $0} /^https?:\/\// {print $0}' urls.txt > full_urls.txt
コマンドの説明:
awk
: 各行をチェックhttps://
またはhttp://
で始まっていない行にドメインを付けるfull_urls.txt
: 絶対URL一覧をこのファイルに保存
ステップ3:Basic認証がかかっているリソースを特定する
抽出したURLの中から、HTTPステータスコードが 401
(=Basic認証要求)となるURLを探します。
while read url; do
code=$(curl -o /dev/null -s -w "%{http_code}" -I "$url")
if [ "$code" = "401" ]; then
echo "Basic認証が必要: $url"
fi
done < full_urls.txt
コマンドの説明:
while read url
: 各URLを1行ずつ処理curl -I
: HTTPヘッダーのみ取得-s -o /dev/null
: 出力を捨て、静かに実行-w "%{http_code}"
: HTTPステータスコードだけを出力if [ "$code" = "401" ]
: Basic認証が必要なリソースを検出
ステップ4:すべてのステータスコードを記録する(任意)
調査結果をすべてファイルに記録したい場合は以下を実行します。
while read url; do
code=$(curl -o /dev/null -s -w "%{http_code}" -I "$url")
echo "$code $url"
done < full_urls.txt > status_report.txt
status_report.txt
にすべてのURLとHTTPステータスコードが記録されます。
ステップ5:一連の処理をシェルスクリプトにまとめる
何度も確認したい場合は、以下のスクリプトを作って再利用するのが便利です。
スクリプト例:check_basic_auth.sh
#!/bin/bash
# 対象ページ
TARGET_URL="https://example-site.com/sample-page"
DOMAIN="https://example-site.com"
# Step 1: HTMLからリソースURLを抽出
curl -s "$TARGET_URL" \
| grep -Eo 'src="[^"]+"|href="[^"]+"' \
| sed 's/src=//;s/href=//;s/"//g' > urls.txt
# Step 2: 相対パスを絶対URLに変換
awk '!/^https?:\/\// {print "'"$DOMAIN"'" $0} /^https?:\/\// {print $0}' urls.txt > full_urls.txt
# Step 3: Basic認証がかかっているURLを表示
echo "▼ Basic認証が必要なリソース"
while read url; do
code=$(curl -o /dev/null -s -w "%{http_code}" -I "$url")
if [ "$code" = "401" ]; then
echo "認証対象: $url"
fi
done < full_urls.txt
# Step 4: 全ステータスコードを保存
echo "▼ ステータス一覧は status_report.txt に出力されます"
while read url; do
code=$(curl -o /dev/null -s -w "%{http_code}" -I "$url")
echo "$code $url"
done < full_urls.txt > status_report.txt
実行手順:
chmod +x check_basic_auth.sh
./check_basic_auth.sh
まとめ
- ページ単体で問題がなくても、読み込まれるリソースにBasic認証がかかっていると表示に支障が出る
curl
とawk
を活用することで、リソース単位での確認が効率的に行える- スクリプト化しておけば、将来的な調査や再発防止にも活用できる
意図しない認証ダイアログやリソースの読み込み失敗に直面した際は、ぜひ本手順を活用してみてください。
コメント