Scarnox · Blog

AWS WAFのcaptchaを解説:仕組みと対処方法

AWS WAF captchaは、サイト運営者が訪問者を確認するように設定したときに、AmazonのWeb Application Firewallが配信するチャレンジです。ファイアウォールが不審と判断したリクエストには、コンテンツの代わりにチャレンジページが返されます。訪問者は、本来のページが読み込まれる前に確認を通過しなければなりません。テストやデータ収集の途中でこれに遭遇したら、見分け方、サイト運営者が管理している項目、そしてScarnoxで今できることを知っておく必要があります。このガイドでは、その3点を扱います。

AWS WAF captchaとは

AWS WAFは、Webアプリケーションの前段に置かれるルールエンジンです。Amazon CloudFront、Application Load Balancer、API Gatewayで使われます。ルールはリクエストを許可、ブロック、カウント、またはチャレンジできます。チャレンジは、ルールの設定によって、サイレントなJavaScriptチェックのこともあれば、目に見えるcaptchaパズルのこともあります。

重要なのは、判断を下すのがサイト運営者だという点です。ファイアウォールはスクレイパーの目的を知りません。見えているトラフィックだけを評価します。リクエストの頻度、IPの評判、ヘッダー、クライアントの振る舞いです。

コードでの見分け方

AWS WAFのチャレンジは、レスポンスから見分けられることがよくあります。よくあるシグナルはx-amzn-waf-actionレスポンスヘッダーで、チャレンジは本来のページが表示される前にHTTPステータス202で返されることが多いです。サイトによってファイアウォールの設定は異なるため、これらは証拠ではなく手がかりとして扱ってください。

import requests

def looks_like_aws_waf(resp: requests.Response) -> bool:
    # ヘッダーは手がかりであって証拠ではない。テスト中のページで必ず確認すること。
    return "x-amzn-waf-action" in resp.headers

resp = requests.get("https://example.com/products", timeout=30)
if looks_like_aws_waf(resp):
    print("Challenge served. Stop, slow down, and check your request rate.")
else:
    print("Status", resp.status_code)

ページのソースに、AWS WAFのチャレンジパスから読み込まれたスクリプトがないか、スクリプトが動くまで中身が表示されないページがないかも確認してください。素のrequests呼び出しでは、データではなくチャレンジページが返ってくることがよくあります。これは想定どおりです。

サイト運営者ができること

自分でサイトを運営しているなら、AWS WAFのコンソールでチャレンジを発生させるルールを調整できます。特に有用な設定は次のとおりです。

自分のサイトをテストしている場合、最も確実な対処は、テストランナーを許可リストに入れることです。自分が管理していないサイトでチャレンジを回避しようとしてはいけません。それはサイト運営者の保護であり、それを破ると真っ先にアクセスが失われます。

Scarnoxでのサポート状況

そのため、作業が許可されているサイトが今日AWS WAFのチャレンジを表示する場合の選択肢は、上で挙げたものです。速度を落とす、自分のサイトなら許可リストを使う、またはサイトの運営者にAPIやデータフィードを依頼する、のいずれかです。アカウントを作成して無料のトライアルクレジットで始めれば、カード登録は不要です。今PopularCaptchaのフローを組んでおき、AWS WAFのサポートが始まったときに備えられます。現在の料金は料金ページにあります。

AWS WAFの背後にある自社サイトのテスト

自分がサイトの運営者で、実際の訪問者のためにファイアウォールを弱めることなく、自動テストをファイアウォールに通したい場合は、チャレンジを回避するのではなく、ファイアウォール自身のツールを使ってください。

これらの手順はファイアウォールの保護を維持しつつ、テストのトラフィックを予測可能にします。それが本当に必要な結果です。テストの設定を変えるたびにルールを見直してください。先月のランナーには正しかったルールが、今はそのランナーをブロックしているかもしれません。

責任あるスクレイピング

AWS WAFのページに当たる理由がデータ収集であるなら、次の点に注意してください。

次のステップ