【トラブル対処】Basic認証がかかっているリソースを特定する方法(curl+シェルスクリプトで簡単調査)

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認証がかかっていると表示に支障が出る
  • curlawk を活用することで、リソース単位での確認が効率的に行える
  • スクリプト化しておけば、将来的な調査や再発防止にも活用できる

意図しない認証ダイアログやリソースの読み込み失敗に直面した際は、ぜひ本手順を活用してみてください。

コメント

タイトルとURLをコピーしました