跳转到内容
搜索文档

集成 Turnstile、WAF 和 Bot Management

最后更新 查看 MarkdownAgent 设置

本教程将指导您如何将 Cloudflare Turnstile、Web 应用程序防火墙 (WAF)Bot Management 集成到现有的身份验证系统中。这种组合可对各种威胁(包括自动化攻击和恶意登录尝试)建立起强大的防御。

概述

要使用 WAF 和 Bot Management,您站点的 DNS 必须指向并经过 Cloudflare。然而,Turnstile 可以独立使用在任何站点上,包括那些不在 Cloudflare 网络上的站点。本教程将涵盖如何实施这三种产品,但如果您的站点不在 Cloudflare 网络上,您可以只关注 Turnstile。

WAF、Bot Management 和 Turnstile 通过在应用程序的不同层级运行,来很好地协同工作:

  • WAF 基于网络信号过滤恶意流量。
  • Bot Management 分析请求以识别并缓解自动化威胁。
  • Turnstile 检查客户端和浏览器信号,以区分人类用户和 bot。

通过结合服务器端(WAF 和 Bot Management)和客户端(Turnstile)安全措施,您可以结合多层防御来创建一个攻击者难以绕过的保护系统。

开始之前

  • 您必须拥有一个可以访问 WAF 和 Bot Management(如果使用)的 Cloudflare 账户。
  • 现有基于 JavaScript/TypeScript 的处理身份验证的路由。

本教程使用一个以纯 HTML 编写的简单登录表单,来演示如何将 Turnstile 集成到您的应用程序中。在后端,一个以 TypeScript 编写的存根 (stubbed out) 身份验证路由将处理登录请求。您可以使用您选择的语言替换它。只要您的语言或框架能够向 Turnstile API 发起外部 HTTP 请求,您就可以将 Turnstile 集成到您的应用程序中。

配置 WAF 和 Bot Management

如果您的网站在 Cloudflare 网络上并订阅了企业版 (Enterprise) 套餐,您必须配置 WAF 和 Bot Management。

针对潜在的 bot 流量发起质询

  1. 在 Cloudflare 仪表板中,前往 WAF 页面。

    Go to WAF ↗
  2. 通过选择 Edit expression(编辑表达式) 创建一个新的自定义 WAF 规则:

    • 字段:Bot Score
    • 运算符:less than or equal to (小于或等于)
    • 值:30
    • 操作:Managed Challenge (托管质询)

此配置对 bot 分数较低的请求发起质询,利用网络信号在潜在威胁到达您的应用程序之前进行识别。您可以根据您的具体用例自定义分数阈值。

设置 Cloudflare Turnstile

Turnstile 可以在任何网站上使用,无论它是否在 Cloudflare 的网络上:

  1. 在 Cloudflare 仪表板中,前往 Turnstile 页面。

    Go to Turnstile ↗
  2. 选择 Add widget(添加小组件) 并填写必要的信息。

  3. 将您的域名添加到 Turnstile 配置中。

  4. 选择 Create(创建)

Turnstile 通过分析浏览器和客户端信号来添加额外的安全层,补充了 WAF 和 Bot Management 执行的服务器端检查。

如果您的网站在 Cloudflare 上,您可以在 Turnstile 的设置中启用使用现有 clearance cookie 的选项。此集成允许 Turnstile 使用 clearance cookie 作为其判断用户是否应接受质询的一部分。此集成是可选的,但如果您已经在使用 WAF 和 Bot Management,则推荐使用。

将 Turnstile 集成到您的应用程序中

在应用程序中实施 Turnstile 包含两个部分:Turnstile 小组件和服务器端验证逻辑。

将 Turnstile 小组件添加到您的登录表单中

将 Turnstile 小组件添加到您现有的登录表单中:

<form id="login-form">
	<input type="text" id="username" placeholder="用户名" required />
	<input type="password" id="password" placeholder="密码" autocomplete="off" required />
	<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div>
	<button type="submit">登录</button>
</form>

<script
	src="https://challenges.cloudflare.com/turnstile/v0/api.js"
	async
	defer
></script>

<YOUR-SITE-KEY> 替换为您的实际 Turnstile site key。

处理登录请求

在您现有的身份验证路由中,添加 Turnstile 验证:

async function validateTurnstileToken(
	ip: string,
	token: string,
	secret: string,
): Promise<boolean> {
	const response = await fetch(
		"https://challenges.cloudflare.com/turnstile/v0/siteverify",
		{
			method: "POST",
			headers: { "Content-Type": "application/json" },
			body: JSON.stringify({ ip, secret, response: token }),
		},
	);

	const outcome = await response.json();
	return outcome.success;
}

// 假设这是一个 TypeScript 路由处理程序。
// 您可以根据您的语言或框架
// 将其替换为不同的实现
export async function onRequestPost(context) {
	const { request, env } = context;
	const { username, password, token } = await request.json();

	// 验证 Turnstile 令牌
	const secretKey = env.TURNSTILE_SECRET_KEY;
	const ip = request.headers.get("CF-Connecting-IP");
	const turnstileValid = await validateTurnstileToken(ip, token, secretKey);
	if (!turnstileValid) {
		// 返回登录页面并显示错误消息
		return Response.redirect("/login", 302, {
			headers: {
				Location: "/login?error=invalid-turnstile-token",
			},
		});
	}

	// 在此处执行您现有的身份验证逻辑
	const isValidLogin = await checkCredentials(username, password);

	if (isValidLogin) {
		return new Response(JSON.stringify({ message: "登录成功" }), {
			status: 200,
			headers: { "Content-Type": "application/json" },
		});
	} else {
		return new Response(JSON.stringify({ error: "凭据无效" }), {
			status: 401,
			headers: { "Content-Type": "application/json" },
		});
	}
}

async function checkCredentials(
	username: string,
	password: string,
): Promise<boolean> {
	// 您现有的凭证检查逻辑
}

此设置可确保在继续登录过程之前,在服务器端验证 Turnstile 令牌,从而基于客户端信号添加了额外的安全层。

测试

部署后,您需要测试您的集成。因为您的 bot 分数可能很低,所以您可能不会收到质询。但是,您可以根据需要添加额外规则以强制重定向到质询页面。执行此操作的一些选项有:

  1. 添加一条 WAF 规则,始终将您的 IP 地址转发到质询页面。
  2. 添加一条 WAF 规则,检查是否存在查询参数,例如 ?challenge=true

最佳实践

  1. 在检查凭证之前,始终先在服务器端验证 Turnstile 令牌。
  2. 使用环境变量来存储敏感信息,例如您的 Turnstile 密匙。
  3. 实施妥善的错误处理和日志记录,以监控潜在的安全问题。

通过将 Turnstile 与 WAF 和 Bot Management 结合使用,您可以在网络层保护您的应用程序,同时还可以使用客户端信号提供额外的保护层。这种方法使得恶意行为者极难对您的登录系统进行自动化攻击。

资源

如果您有兴趣自定义 Turnstile,请参阅以下资源以获取更多信息:

  • 客户端渲染。了解如何自定义 Turnstile 在用户界面中的渲染方式和时机,以更好地满足您应用程序的需求和用户体验。
  • 服务器端验证。了解 Turnstile 的 API 的工作原理(包括请求参数),以及如何处理不同类型的响应(包括错误代码)。
  • Turnstile 分析 (Turnstile Analytics)。了解如何在 Cloudflare 仪表板中查看 Turnstile 的分析。这包括有关发出的质询数量以及质询解决率 (CSR) 的指标。

这篇文档对您有帮助吗?