A 9. modul rétegábrája megmutatta, mi fut a kérésed előtt. Itt a gyakorlat következik: mit állíts be induláskor, mit csinálj támadás alatt, hogyan írsz saját WAF-szabályt, és hogyan teszed be a Turnstile-t a Nuxt-űrlapjaidba.
A hálózati és alkalmazásrétegű DDoS-védelem alapból aktív minden proxyzott zónán, konfiguráció és külön díj nélkül. Ez nem marketingmondat: a legtöbb támadás úgy zajlik le, hogy észre sem veszed — legfeljebb utólag látod a grafikonon. Amit érdemes tudnod:
| Helyzet | Mit csinálj |
|---|---|
| Normál üzem | semmit — a managed DDoS-szabályok futnak. Legfeljebb nézd meg havonta a Security Analytics-et, hogy lásd a mintát. |
| Gyanús forgalmi csúcs | Security Events: honnan jön (ország, ASN, IP), milyen útvonalra, milyen user agenttel? Ebből születik a célzott szabály. |
| Aktív, zavaró támadás | célzott custom rule (blokk vagy managed challenge) a támadás mintájára — ez a pontos eszköz. |
| Nagy baj, nincs idő elemezni | „I'm Under Attack" mód: minden látogató kap egy rövid ellenőrző oldalt. Durva eszköz (rontja a UX-et, töri az API-hívásokat), átmenetileg használd, és csak a weboldalon — az API-alútvonalakat vedd ki alóla Configuration Rule-lal. |
Sorrendben, az első naptól:
/api/auth/*, jelszó-visszaállítás, regisztráció, keresés, export.| Cél | Feltétel (kifejezés-nyelven, vázlatosan) | Akció |
|---|---|---|
| Admin-felület védelme | http.request.uri.path contains "/admin" és nem a te IP-tartományod | blokk (vagy még jobb: Cloudflare Access, 9. modul) |
| Régi API-verzió kivezetése | http.request.uri.path contains "/api/v1/" | blokk vagy átirányítás |
| Nem várt HTTP-metódus | http.request.method in {"TRACE" "TRACK"} | blokk |
| Ország-korlátozás (ha az üzlet indokolja) | ip.geoip.country not in {"HU" "DE" "AT"} és /api/ | managed challenge |
| Scraper-minta | gyanús user agent + magas kérésszám | managed challenge |
| Webhook-végpont zárása | /webhooks/stripe és nem a Stripe ASN/IP-tartománya | blokk (az aláírás-ellenőrzés mellé, 19. modul) |
Amikor egy felhasználó azt írja, hogy „nem tudok belépni" vagy „503-at kapok", és a Workers-logokban semmi nincs (9. modul), akkor a kérés valószínűleg el sem jutott a kódodig. A Security Events (Security Analytics) mutatja meg:
Innen két irány van: ha valós támadás, finomítod a szabályt; ha false positive (a saját forgalmad akadt fenn), akkor kivételt veszel fel — például egy skip szabállyal az adott útvonalra és a konkrét managed rule ID-ra. Ez a napi biztonsági rutin nagy része.
A Turnstile a reCAPTCHA-alternatíva: a legtöbb valódi felhasználónak semmit nem kell megoldania (nincs tűzoltócsap-kattintgatás), a védelem a böngésző-jelekből és viselkedésből dolgozik. Ingyenes, és nem a Google-nek adja az adataidat — ami EU-s ügyfeleknél önmagában érv.
<template>
<div ref="el"></div>
</template>
<script setup>
const el = ref();
const emit = defineEmits(["verified"]);
onMounted(() => {
// a Turnstile script betöltése után:
window.turnstile.render(el.value, {
sitekey: useRuntimeConfig().public.turnstileSiteKey,
callback: (token) => emit("verified", token), // ezt küldjük a szervernek
});
});
</script>
A kliensről érkező token önmagában semmit nem jelent: a szervernek kell ellenőriznie a Cloudflare-nél. Enélkül a widget csak díszlet, amit egy szkript megkerül.
server/utils/turnstile.tsexport async function verifyTurnstile(env, token: string, ip?: string) {
const form = new FormData();
form.append("secret", env.TURNSTILE_SECRET_KEY); // secret! (12. modul)
form.append("response", token);
if (ip) form.append("remoteip", ip);
const res = await fetch(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",
{ method: "POST", body: form }
);
const data = await res.json();
return data.success === true;
}
server/api/auth/register.post.ts — használat
export default defineEventHandler(async (event) => {
const { env, cf } = event.context.cloudflare;
const body = await readBody(event);
const ip = getHeader(event, "cf-connecting-ip");
if (!(await verifyTurnstile(env, body.turnstileToken, ip))) {
throw createError({ statusCode: 400, message: "Ellenőrzés sikertelen" });
}
// … innentől a rendes regisztrációs logika (17. modul)
});
| Fenyegetés | Elsődleges védelem | Kiegészítés |
|---|---|---|
| Volumetrikus DDoS | automatikus DDoS-védelem | Under Attack mód végszükségben |
| Brute force (login) | rate limiting rule (zóna) | fiókonkénti számláló DO-val (7. modul), lockout |
| Scraping | bot-védelem + rate limit | Turnstile a belépési pontokon |
| Bot-regisztráció, spam | Turnstile | email-megerősítés, domain-szűrés |
| Ismert támadási minták (SQLi, XSS) | WAF managed rules | paraméterezett lekérdezések a kódban (5. modul!) |
| Üzleti kvóta-túllépés | DO-limiter (7. modul) | AI-nál spend limit (15b. modul) |
| Belső eszközök | Cloudflare Access | Tunnel (21. modul), nem publikus origin |
| Adatszivárgás tenantok közt | a kódod (17., 18. modul) | ezt semmilyen WAF nem védi ki |
Alapból semmit — a managed DDoS-szabályok minden proxyzott zónán futnak. Kézi beavatkozás akkor kell, ha zavaró, célzott támadás megy: a Security Eventsből azonosított minta alapján custom rule; végszükségben Under Attack mód, de csak átmenetileg és az API-útvonalak kivételével.
Mert a saját forgalmad is illeszkedhet a mintákra (JSON-testű API-k, szokatlan paraméterek), és azonnali blokkolás mellett a partnereid vagy a saját integrációid kapnak 403-at. Néhány nap log-mód után látod a false positive-okat, és skip-szabállyal kezeled őket.
Security Events: ott látszik, melyik szabály (managed, custom, rate limit) milyen akcióval fogta meg a kérést, és milyen jellemzőkkel (IP, ország, ASN, user agent, path). A blokkolt kérés el sem éri a Workert, ezért nincs a log-jaidban.
Nem — a widget csak tokent ad. A szervernek ellenőriznie kell a tokent a siteverify végponton a titkos kulccsal (és érdemes átadni a cf-connecting-ip-t). Szerveroldali validáció nélkül a widget megkerülhető.
A tenantok közti adatszivárgás ellen: azt a te kódod dönti el (tenant-szűrés a lekérdezésekben, cache-kulcsok, jogosultság-ellenőrzés — 17. és 18. modul). A WAF a külső támadót fogja, nem a hibás üzleti logikát.