手把手部署Captcha!

手把手部署Captcha!

2024 12 20
2870 字 · 14 分钟

在如今的网络世界里,各种自动化攻击手段层出不穷,像恶意爬虫、垃圾评论等,

搞得大家人心惶惶的

怎么办???????

部署captcha或许是个不错的主意!

笔者深入研究了Turnstile、reCaptcha、hCaptcha这三种主流的captcha部署方案,

现在手把手地为大家详细讲解如何部署这三种captcha。

Q:请问我需要准备什么?

A:一个Cloudflare账户、一个脑子!


hCaptcha


hCaptcha是什么

自己去搜

前期准备

进入页面后,填写你的邮箱,然后:

其一:国家/地区最好选择日本、美国、港澳台地区

其二:126、163、Gmail、icloud邮箱均可(笔者试了hotmail和qq好像都不行)

当然你选择Google或者Github注册也可

注册完毕后你应该会看见这个界面:

查看你填写的邮箱收件箱,点击确认电子邮件地址或下方的url前去设置密码

完成之后,hCaptcha也会发邮件恭喜你注册成功(会有中英文两封,如下图)

此时,前往登录即可

获取密钥

登录成功后,你会进入如下页面:

点击添加站点,进入添加页面

首先,姓名(网站名称)随意填写,你看得懂就好

域名输入你的网站即可(按回车没有用滴)

hCaptcha行为,看你的实际情况选择

最终填写的示范如下(你的不一定要跟笔者一样哦)

完成填写后,点击节省(英文:Save,在此处应译为保存)

接下来,你会进入这个页面(如下图示意)

首先,先复制站点密钥(站点名称下面那一长串,点击可以保存),

然后,点击右上角头像→设置,下滑找到账户级密钥,然后点击生成新秘密

(如果弹出了*当前账户级密钥将立即失效。是否继续?*的窗口,点击产生即可,不用理它)

千万注意,这个密钥(ES开头)只会显示一次!推荐复制下来粘贴到记事本上,避免丢失!

正式部署

更详细的:hCaptcha帮助文档

前端测试

打开你的本地项目,首先键入基础代码:

HTML
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Demo hCaptcha</title>
		<script src="https://hcaptcha.com/1/api.js" async defer></script>
		<style>
			 .center{
				text-align: center;
				border-radius: 20px;
				width: 300px;
				height: 350px;
				position: absolute;
				left: 50%;
				top: 50%;
				transform: translate(-50%,-50%);
			}
		</style>
	</head>
	<body>
		<div class="center">
			<h1>hCaptcha 验证</h1>
			<div data-sitekey=" " class="h-captcha"></div>
			<!--              ^^^ Copy你的站点密钥进去 -->
		</div>
	</body>
</html>

这个时候你的页面应该是这样子的:

这个时候你就可以自己做一遍人机验证了(不太人性就是了

后端验证

做完验证了,然后呢?做完就完了?怎么可能!

接下来你需要在后端向hCaptcha发送验证请求!

首先我们需要创建一个Workers

打开Cloudflare仪表板→Workers和Pages( 计算(Workers) )→创建(如下图所示

进入页面只管点击从Hello world!开始 右边的“开始使用”,然后你应该进入这个页面:

名称你可随意填写,能辨别即可,笔者在此以api-verify为例

下滑,点击部署,然后部署成功页面点击“地球”右上的编辑代码按钮

进入页面后,删光原有代码,然后粘贴以下代码:

JAVASCRIPT
export default {
  async fetch(request, env, ctx) {
    const url = "https://api.hcaptcha.com/siteverify"; // hCaptcha 后端验证网址
	const secret = ""; //在此处填充你的账户级密钥
    const token = (new URL(request.url)).pathname.split("/")[1];//获取挑战令牌
    let response=await fetch(`${url}?secret=${secret}&response=${token}`,{method:"POST"});//发送验证请求
    let res=await response.json();
    return new Response(JSON.stringify(res),{headers:{
      "content-type": "application/json;charset=UTF-8"}
    });
  },
};

完毕后点击右上角的部署,当网页下方弹出绿色的版本已保存 就行了

打开Cloudflare仪表板→计算(Workers)→你的Worker →设置(如下图所示

记下图中画蓝线的网址,然后打开你的本地项目,先给captcha的div容器新增参数:

HTML
<div data-sitekey="" data-callback="rvCallback" class="h-captcha"></div>
<!-- 意思就是,当挑战完成后自动执行rvCallback函数 -->

在div容器上边增加脚本:

HTML
<script>
	async function rvCallback(args){
		const url = "";//填充你刚才画蓝线的网址,注意加上 https:// 前缀
		let response=await fetch(`${url}/${args}`);
		let res=await response.json();
		if(res.success)alert("OK");//目标:完成验证后弹窗
	}
</script>

到这一步基本上大功告成了,如下图所示:

hCaptcha还有其他东西,你可以前往上文寻找他们的帮助文档

本地部署

hCaptcha的帮助文档提到过,在本地部署时,不允许本地主机发送请求,但可以通过修改hosts的方式发送请求

但是!你可别信吼

如果你试了就会发现,控制台一直在报错:

CMD
Access to fetch at '...' from origin '...' has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

以下是笔者咨询ChatGPT后得到的答复:

CORS 报错,其实不是前端配置的问题,而是由于 hCaptcha 的后端验证 API https://api.hcaptcha.com/siteverify 并不支持从浏览器前端直接调用。这属于安全设计 —— 账户密钥 secret 是敏感信息,只能在后端服务器中使用,而不能暴露在浏览器中。 前端浏览器的请求携带了 secret 密钥,被浏览器当成跨域请求(CORS),而 api.hcaptcha.com 出于安全考虑并不允许浏览器跨域访问验证接口。

后记

谁能想到hCaptcha的中文版好奇怪,一看就是直接拿翻译软件的,不然保存为什么会是节省

虽然save的确有个意思就是节省啦…

Turnstile


Turnstile是什么

CF的帮助文档有,自己去搜

前期准备

打开Cloudflare仪表板→Turnstile(如下图所示

点击添加小组件

小组件名称随便写,你看得懂就行

主机名填写你的网站即可(注:如果你需要本地部署,可以增加127.0.0.1

剩下的小组件模式和预先许可,你可以查看它们的帮助文档(蓝色的框框)

完成后下滑,点击创建,会弹出以下页面:

对于这两个密钥,你可以先手复制,也可以稍后复制(反正它不会消失的~)

开始部署

更详细的:Turnstile帮助文档

前端测试

打开你的本地项目,首先键入基础代码:

HTML
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Demo CF-Turnstile</title>
		<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=_turnstileCb" async defer></script>
		<style>
			 .center{
				text-align: center;
				border-radius: 20px;
				width: 300px;
				height: 350px;
				position: absolute;
				left: 50%;
				top: 50%;
				transform: translate(-50%,-50%);
			}
		</style>
	</head>
	<body>
		<script>
			function _turnstileCb() {  
				turnstile.render('#cf-turnstile', { 
					sitekey: '',// 填充你的站点密钥
				}); 
			}
		</script>
		<div class="center">
			<h1>Turnstile 验证</h1>
			<div id="cf-turnstile"></div>
		</div>
	</body>
</html>

第6行,这是turnstile的api,必须有,其中onload=_turnstileCb意思是API加载 成功后自动执行_turnstileCb函数

这个时候你的页面应该是这样子的:

这个时候你就可以自己做一遍了(可能有点慢?

后端验证

首先我们需要创建一个Workers

创建Workers的流程不再赘述,详情可看创建Workers in hCaptcha

进入部署页面后,删光原有代码,然后粘贴以下代码:

JAVASCRIPT
export default {
	async fetch(request, env, ctx) {
		const url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'; // CF 后端验证网址
		const secret = ""; //在此处填充你的密钥(站点密钥下面那个)
		const token = (new URL(request.url)).pathname.split("/")[1];//获取挑战编码
		let packages=new FormData();
		packages.append("secret",secret);
		packages.append("response",token);
		let response=await fetch(url,{body:packages,method:"POST"});//发送验证请求
		let res=await response.json(); 
		return new Response(JSON.stringify(res),{headers:{
		  "content-type": "application/json;charset=UTF-8"}
		});
	},
};

回到本地项目,给脚本加点东西

JAVASCRIPT
<script>
	function _turnstileCb() {  
		turnstile.render('#cf-turnstile', { 
			sitekey: '',// 填充你的站点密钥
			callback: async function(token){
				const url = "";//填充你刚才画蓝线的网址,注意加上 https:// 前缀
				let response=await fetch(`${url}/${token}`);
				let res=await response.json();
				if(res.success)alert("OK");//目标:完成验证后弹窗
			}
		}); 
	}
</script>

到这一步基本上大功告成了,如下图所示:

控制台的401

部署的时候可能会发现:控制台报了401错误?

笔者前去帮助文档找到了相关的内容:

您可以放心地忽略该错误。它正在请求您的设备或浏览器尚不支持的专用访问令牌(PAT)。 (原话:You can safely ignore the error. It is requesting a Private Access Token (PAT) that your device or browser does not support yet.)

一句话总结:不管它就得了

后记

如何让Turnstile验证快一些?

多多点击页面,向CF表面你是真人,急切希望通过这个该死的挑战

笔者亲试,成功率蛮高的

reCaptcha


reCaptcha是什么

自己去搜

前期准备

首先你需要注册一个Google账户(具体如何注册,自行上网查阅)

但是呢,由于Google在国内被防火长城墙了,所以会一直报响应超时或者连接重置

这个时候你就得科学上网了

笔者教你怎么科学上网:

本内容由于违反了《中华人民共和国计算机信息网络国际联网管理暂行规定》等法律法规,故不予显示,望周知。

前往:谷歌reCaptcha 创建页面

进入页面后,标签名称随便写,你看得懂就行

reCaptcha类型,笔者在这里介绍的是v2的人机身份验证,若你 有其他需求,可以去看reCaptcha的帮助文档,有介绍到

域名填写你的网站即可(注:如果你需要本地部署,可以增加127.0.0.1, 而且可以按回车添加)

至于Google Cloud Platform的项目名称,笔者不太了解,随便填填就得

完成后下滑,点击提交,然后会弹出这个页面:

对于这两个密钥,你可以先手复制,也可以稍后复制(反正它不会消失的~)

开始部署

打开你的本地项目,首先键入基础代码:

HTML
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Demo reCaptcha</title>
		<script src="https://www.recaptcha.net/recaptcha/api.js?onload=onloadCallback&render=explicit"></script>
		<style>
			 .center{
				text-align: center;
				border-radius: 20px;
				width: 300px;
				height: 350px;
				position: absolute;
				left: 50%;
				top: 50%;
				transform: translate(-50%,-50%);
			}
		</style>
	</head>
	<body>
		<script>
			function onloadCallback() {
				grecaptcha.render('recaptcha', {
					'sitekey' : '',// 填充你的站点密钥
				});
			};
		</script>
		<div class="center">
			<h1>reCaptcha 验证</h1>
			<div id="recaptcha"></div>
		</div>
	</body>
</html>

第6行,这是recaptcha的api,必须有,其中onload=onloadCallback意思是API加载 成功后自动执行onloadCallback函数

这个时候你的页面应该是这样子的:

这个时候你就可以自己做一遍了

后端验证

首先我们需要创建一个Workers

创建Workers的流程不再赘述,详情可看创建Workers in hCaptcha

进入部署页面后,删光原有代码,然后粘贴以下代码:

JAVASCRIPT
export default {
	async fetch(request, env, ctx) {
		const url = 'https://www.recaptcha.net/recaptcha/api/siteverify'; // recaptcha 后端验证网址
		const secret = ""; //在此处填充你的密钥(站点密钥下面那个)
		const token = (new URL(request.url)).pathname.split("/")[1];//获取挑战编码
		let response=await fetch(`${url}?secret=${secret}&response=${token}`,{method:"POST"});//发送验证请求
		let res=await response.json(); 
		return new Response(JSON.stringify(res),{headers:{
		  "content-type": "application/json;charset=UTF-8"}
		});
	},
};

回到本地项目,给脚本加点东西

HTML
<script>
	function onloadCallback() {
		grecaptcha.render('recaptcha', {
			'sitekey' : '',// 填充你的站点密钥
			'callback' : async function(args){
				const url = "";//填充你刚才画蓝线的网址,注意加上 https:// 前缀
				let response=await fetch(`${url}/${args}`);
				let res=await response.json();
				if(res.success)alert("OK");//目标:完成验证后弹窗
			}
		});
	};
</script>

到这一步基本上大功告成了,如下图所示:

后记

总而言之,言而总之

希望大家都能学废吧(bushi)

(最起码别给机器人把评论区刷成鸟屎)

如果你碰到了难题,随时可以通过联系笔者,笔者会为你解答


感谢您的阅读!

手把手部署Captcha!

2024 12 20
2870 字 · 14 分钟