コンテンツにスキップ

第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経由で作成します。

Terminal window
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)、過剰アクセスなどの攻撃パターンをエッジでリアルタイムに検知・遮断するファイアウォール。