第24章: Turnstile と WAFルールのCLI/API自動化
個人開発Webサービスを公開すると、悪質なボットによるスクレイピングやスパム投稿、ブルートフォース攻撃に晒されます。 Cloudflareの Turnstile(ユーザー体験を損なわないスマートCAPTCHA)と Custom WAF Rules を活用して、エッジで脅威を自動排除します。
1. Turnstile トークンのサーバーサイド検証(Hono)
フロントエンドで取得した cf-turnstile-response トークンを、Workers側で検証する実装です。
import { Hono } from 'hono';
const app = new Hono<{ Bindings: { TURNSTILE_SECRET_KEY: string } }>();
app.post('/api/submit-form', async (c) => { const { turnstileToken, formData } = await c.req.json();
// Cloudflare Turnstile 検証エンドポイントへ問い合わせ const verifyRes = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ secret: c.env.TURNSTILE_SECRET_KEY, response: turnstileToken, remoteip: c.req.header('CF-Connecting-IP') || '', }), });
const outcome: any = await verifyRes.json(); if (!outcome.success) { return c.json({ error: 'ボット検知:認証に失敗しました' }, 403); }
// フォーム処理 return c.json({ success: true });});
export default app;2. CLI / API によるレートリミットルールの設定
「同一IPから1分間に60回以上のリクエストがあったら一時ブロックする」ルールをAPI経由で作成します。
curl -X POST "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/rulesets/phases/http_ratelimit/entrypoint" \ -H "Authorization: Bearer <API_TOKEN>" \ -H "Content-Type: application/json" \ -d '{ "rules": [ { "action": "block", "ratelimit": { "characteristics": ["cf.colo.id", "ip.src"], "period": 60, "requests_per_period": 60 }, "expression": "http.request.uri.path matches \"^/api/\"", "description": "APIエンドポイントのレートリミット保護" } ] }'これにより、DDoS攻撃や悪質クローラーからオリジンとWorkers実行回数を防御できます。
💡 用語解説コラム
[!NOTE] Turnstile (ターンスタイル)
「歪んだ文字の入力」や「信号機の選択」を強制せず、ブラウザの挙動から人間かどうかを数ミリ秒で自動判定するCloudflareのスマートCAPTCHA代替技術。
[!NOTE] WAF (Web Application Firewall)
SQLインジェクション、クロスサイトスクリプティング(XSS)、過剰アクセスなどの攻撃パターンをエッジでリアルタイムに検知・遮断するファイアウォール。