AWS WAF-captcha uitgelegd en hoe je ermee omgaat
AWS WAF-captcha is een uitdaging die wordt aangeboden door de Web Application Firewall van Amazon wanneer een siteeigenaar heeft ingesteld dat bezoekers gecontroleerd moeten worden. Een verzoek dat de firewall verdacht vindt, krijgt een uitdagingspagina in plaats van de inhoud. De bezoeker moet dan een controle doorstaan voordat de echte pagina laadt. Als je er tijdens het testen of verzamelen van data tegenaan loopt, moet je weten hoe je hem herkent, wat de siteeigenaar beheert en wat Scarnox nu kan doen. Deze gids behandelt alle drie.
Wat de AWS WAF-captcha is
AWS WAF is een regelengine die voor een webapplicatie staat, op Amazon CloudFront, een Application Load Balancer of een API Gateway. Regels kunnen een verzoek toestaan, blokkeren, tellen of uitdagen. Een uitdaging kan een stille JavaScript-controle zijn of een zichtbare captcha-puzzel, afhankelijk van hoe de regel is ingesteld.
Het belangrijkste punt is dat de beslissing wordt genomen door de siteeigenaar. De firewall kent het doel van je scraper niet. Hij beoordeelt alleen het verkeer dat hij ziet: de snelheid van verzoeken, de IP-reputatie, de headers en het gedrag van de client.
Hoe je hem in code herkent
AWS WAF-uitdagingen zijn vaak herkenbaar aan hun antwoorden. Een veelvoorkomend signaal is de response-header x-amzn-waf-action, en een uitdaging wordt vaak geserveerd met HTTP-status 202 voordat de echte pagina verschijnt. Behandel deze als signalen, niet als bewijs, want sites configureren de firewall verschillend:
import requests
def looks_like_aws_waf(resp: requests.Response) -> bool:
# Een headersignaal, geen bewijs. Controleer tegen de pagina die je test.
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)
Let ook op een script dat is geladen vanaf een AWS WAF-uitdagingspad in de broncode van de pagina, en op een pagina die geen inhoud toont totdat een script draait. Een gewone requests-aanroep krijgt vaak de uitdagingspagina in plaats van de data. Dat is normaal.
Wat de siteeigenaar kan doen
Als je de site beheert, kun je in de AWS WAF-console de regels afstellen die een uitdaging activeren. De nuttigste opties zijn:
- Op snelheid gebaseerde regels die alleen clients uitdagen die te veel verzoeken sturen, zodat gewone bezoekers doorgaan.
- Allowlists voor je eigen monitoring, CI of IP-bereiken van partners, zodat je eigen tests niet worden uitgedaagd.
- Een uitdaging alleen op gevoelige paden, zoals inloggen of afrekenen, in plaats van op de hele site.
Als je je eigen site test, is de schoonste oplossing een allowlist voor je testrunners. Probeer de uitdaging niet te verslaan op een site die je niet beheert. Dat is de bescherming van de eigenaar, en het is het eerste dat je toegang zal breken.
Waar Scarnox-ondersteuning nu staat
- Nu live: PopularCaptcha, zonder proxy en met je eigen proxy.
- Binnenkort: AWS WAF, naast GeeTest, reCAPTCHA v2 en v3, Cloudflare Turnstile en Arkose. Ontwerp geen productieflow die afhankelijk is van een AWS WAF-oplossing zolang die niet als live staat vermeld.
Als een site waarmee je mag werken vandaag een AWS WAF-uitdaging toont, zijn de opties die hierboven staan: vertragen, een allowlist gebruiken als de site van jou is, of de siteeigenaar vragen om een API of datafeed. Je kunt een account aanmaken en beginnen met gratis proefcredit, zonder creditcard, om nu je PopularCaptcha-flow op te zetten en klaar te zijn wanneer AWS WAF-ondersteuning live gaat. Actuele prijzen vind je op de prijzenpagina.
Test je eigen site achter AWS WAF
Als je de siteeigenaar bent en wilt dat geautomatiseerde tests de firewall passeren zonder hem voor echte bezoekers te verzwakken, gebruik dan de eigen tools van de firewall in plaats van de uitdaging te omzeilen:
- Start een nieuwe regel in de count-modus. Die registreert de verzoeken die uitgedaagd zouden worden zonder iemand te raken, zodat je precies ziet wat je tests activeren.
- Zet WAF-logging aan naar Amazon CloudWatch Logs, Amazon S3 of Amazon Data Firehose. Het log laat zien welke regel is gematcht en welke header of welk pad de oorzaak was.
- Geef de testomgeving een eigen staging-domein met een aparte regelset, zodat productie beschermd blijft terwijl je suite vrij kan draaien.
- Sta alleen de specifieke IP-bereiken of headerwaarden toe die je testrunners gebruiken, en controleer die lijst telkens wanneer de runners veranderen.
Deze stappen houden de bescherming op zijn plaats en maken het testverkeer voorspelbaar, wat het resultaat is dat je echt nodig hebt. Controleer de regels na elke wijziging in je testopzet, want een regel die voor de runners van vorige maand klopte, kan ze nu blokkeren.
Scrape verantwoord
Als je een AWS WAF-pagina opvraagt om data te verzamelen:
- Lees
robots.txten de servicevoorwaarden van de site voordat je verzoeken stuurt. - Houd het aantal verzoeken laag. Een uitdaging is vaak de site die vraagt om langzamer te gaan.
- Stop wanneer de site duidelijk geen geautomatiseerde toegang wil.
- Verzamel geen persoonsgegevens waarvoor je geen reden hebt om ze te bewaren, en behandel alle gegevens die je wel verzamelt volgens de toepasselijke privacyregels.