Scarnox · Blog

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:

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

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:

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:

Volgende stappen