Spam from Website Enquiry

网站一般上都会有 Contact Us 页面. 里头有一个表格, 访客可以通过提交表格发出对产品和服务的讯问.

本来是一个质询功能, 但就是有坏人利用这个功能, 给站长提交了广告内容. 本来是给你质询的, 你却拿来发广告给我! 气得我...

更过分的是, 这些还不是"人", 而是用 robot 代劳. 一天就能收到几百封广告邮件.

看图填字

这也不是第一天的事儿了, 解决方案也很早就有了. 就是区分人和机器.

表格提交前要求完成一个小任务, 人类可以轻松完成, 但机器却很难完成的任务.

比如早年的看图填字.

但随着机器识别度越来越好, 只能把图越弄越乱, 最后连人都很难看得出里面的字了...严重影响了人类的使用体验.

Google reCAPTCHA 2.0

后来 Google 推出了 reCAPTCHA 服务. 它是一个 SaaS 服务.

它的体验是这样的

比起看图填字轻松多了.

你可能会想这个机器做不了吗? 还真的哦. Google 搞了一套 JavaScript 会一直监听整个 Page 的游览过程, 一直到最终点击 i'm not a robot.

然后它会依据之前的 tracking 判断访客是不是 robot, 会有一个分数指标 1 到 10 分. 越高就越好 (代表是人操作)

reCAPTCHA 流程和原理

可能你会想, 坏人能不能直接用 JavaScript 做 form submit 呢?

其实是不能的, reCAPTCHA 的工作流程是, JavaScript 负责生成一个 token, 然后和 form 一起提交到服务端.

服务端再把 token 发送到 Google reCAPTCHA SaaS 服务端, 获取这个 token 的分数.

然后你可以依据分数, 自行决定如何处理这个 form submit. 比如, 1分的话, 视为 robot 不处理, 8分以上才 process.

reCAPTCHA 3.0

3.0 对 2.0 做了一些改进. 它把 checkbox 拿掉了. 用户不需要再多点击一下.

在 form submit 的同时, 我们需要调用 JavaScript 去获取 token, 然后一起提交到服务端.

这个体验比之前好了一点点. 但是也引入了另一个小问题.

由于 reCAPTCHA 会 tracking 访客行为, 在这个隐私至上的世界, 必须让用户知道它被 tracking 了, 不然可能挨告.

有几个方式可以做声明

第一种是在网站的右下方显示一个 icon, 这也是 reCAPTCHA 默认显示方式

但很多设计师都不喜欢这个方式, 因为右下角通常是放 live chat, back to top icon 的.

第二种是在 submit button 下面放声明, 只要声明显眼就可以了.

第三种也是在 submti button 附近放 reCAPTCHA icon

Register reCAPTCHA

官网申请就可以了.

唯一要注意的是, 想本地测试的话, 要 allow localhost, 或者 local IP address

申请完成后到 setting > reCAPTCHA keys 获取 site key 和 secket key

JavaScript reCAPTCHA

import { googleAppSetting } from './google-app-setting';

declare global {
const grecaptcha: {
ready: (callback: unknown) => void;
execute: (siteKey: string, options: { action: string }) => Promise<string>;
};
} let scriptLoadedPromise: Promise<void> | null = null; export function appendScriptAsync(): Promise<void> {
if (scriptLoadedPromise !== null) {
return scriptLoadedPromise;
} else {
scriptLoadedPromise = new Promise(resolve => {
const script = document.createElement('script');
script.onload = () => {
resolve();
};
script.src = `https://www.google.com/recaptcha/api.js?render=${googleAppSetting.google.reCaptcha.siteKey}`;
document.head.appendChild(script);
});
return scriptLoadedPromise;
}
} export async function GetTokenAsync(action: string): Promise<string> {
await appendScriptAsync();
return new Promise<string>(resolve => {
grecaptcha.ready(async () => {
grecaptcha.execute(googleAppSetting.google.reCaptcha.siteKey, { action }).then(resolve);
});
});
}

使用

ASP.NET Core reCAPTCHA

using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.Extensions.Options; namespace Stooges.ReCaptcha;
public class ReCaptchaHttpResponseData
{
public bool Success { get; set; } [JsonPropertyName("challenge_ts")]
public DateTime ChallengeTs { get; set; } // utm 时间 public string Hostname { get; set; } = ""; // domain public decimal Score { get; set; } public string Action { get; set; } = ""; [JsonPropertyName("error-codes")]
public List<string>? ErrorCodes { get; set; }
}
public class ReCaptchaHttpClient
{
private readonly HttpClient _httpClient;
private readonly ReCaptchaOptions _reCaptchaOption; public ReCaptchaHttpClient(
HttpClient httpClient,
IOptionsSnapshot<ReCaptchaOptions> reCaptchaOptionsAccessor
)
{
_reCaptchaOption = reCaptchaOptionsAccessor.Value;
var uri = new Uri("https://www.google.com/recaptcha/api/siteverify");
httpClient.BaseAddress = uri;
_httpClient = httpClient;
} /// <summary>
///
/// </summary>
/// <param name="token">passing from fontend</param>
/// <param name="action">for protect hacking, should match with fontend</param>
/// <returns>score, if error will also return 0</returns>
public async Task<decimal> GetScoreAsync(string token, string action)
{
var queryBuilder = new QueryBuilder
{
{ "secret", _reCaptchaOption.SecretKey },
{ "response", token }
};
var queryString = queryBuilder.ToString();
var response = await _httpClient.PostAsync(queryString, new StringContent(""));
if (!response.IsSuccessStatusCode) { return 0; }
var responseDataJson = await response.Content.ReadAsStringAsync();
var responseData = JsonSerializer.Deserialize<ReCaptchaHttpResponseData>(
responseDataJson,
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }
)!;
if (!responseData.Success) { return 0; }
if (responseData.Action != action) { return 0; }
return responseData.Score;
}
}

使用

Google reCAPTCHA的更多相关文章

  1. ASP.NET Core 使用 Google 验证码(Google reCAPTCHA)

    关心最多的问题,不FQ能不能用,答案是能.Google官方提供额外的域名来提供服务,国内可以正常使用. 一. 前言 验证码在我们实际的生活场景中非常常见,可以防止恶意破解密码.刷票.论坛灌水.刷注册等 ...

  2. Google reCAPTCHA 2 : Protect your site from spam and abuse & Google reCAPTCHA 2官方教程

    1

  3. Google recaptcha在webform中的使用

    开源项目 https://github.com/tanveery/recaptcha-net   这个的NuGet下载量最高 https://github.com/PaulMiami/reCAPTCH ...

  4. Google reCAPTCHA 人机身份验证

    1. 适合范围 注册及登录某些使用Google验证码的网站,如https://zaif.jp/,会要求进行人机身份验证 2. 方法介绍 下载老D的Google hosts以及一键更新批处理程序 老D博 ...

  5. ASP.NET Core 使用 Google 验证码(reCAPTCHA v3)代替传统验证码

    写在前面 友情提示: Google reCAPTCHA(v3下同) 的使用不需要"梯子",但申请账号的时候需要! Google reCAPTCHA 的使用不需要"梯子&q ...

  6. 在国内使用Google验证码reCaptcha

    如今各大网站都不可缺少的一部分就是验证码,验证码具有防止恶意批量操作,保护账户安全等作用.但是现在各种暴力破解验证码的手段层出不穷,验证码的保护也就失去了意义.所以各大平台为了应对这种情况也是使用类似 ...

  7. ReCAPTCHA & 手势验证

    手势验证 recaptcha https://www.vaptcha.com/ https://www.vaptcha.com/document https://www.iviewui.com/com ...

  8. google recaptcha-v2

    最近在给公司的网页把传统的输入字符数字的验证码改google reCAPTCHA验证,就写写我学到的和一些我的理解!说得不好请勿怪!有兴趣可以的去https://developers.google.c ...

  9. google 人机身份验证

    google 人机身份验证 Are you a robot? Introducing "No CAPTCHA reCAPTCHA" https://googleonlinesecu ...

  10. SourceTree安装教程和GitLab配置详解

    一.安装Git 链接: http://pan.baidu.com/s/1mh7rICK 密码: 48dj 二.安装SourceTree 链接: http://pan.baidu.com/s/1skWk ...

随机推荐

  1. 使用PHP实现字符串的上标和下标,比如:M²和Log₂FC

    要在PHP中实现字符串的上标和下标效果,并直接在命令行或网页中正确显示,你可以分别使用Unicode转义序列或HTML实体来表示上标(UPER)和下标(SUB)字符.对于打印到网页的情况,可以使用HT ...

  2. [oeasy]python0132_[趣味拓展]emoji_表情符号_抽象话_由来_流汗黄豆

    emoji表情符号 回忆上次内容 上次了解了unicode 和 utf-8 unicode是字符集 utf-8是一种可变长度的编码方式 utf-8是实现unicode的存储和传输的现实的方式   ​ ...

  3. 题解:P10732 [NOISG2019 Prelim] Palindromic FizzBuzz

    题解:P10732 [NOISG2019 Prelim] Palindromic FizzBuzz 题意 题意十分明了,给予你一个区间,判断区间中每一个数是否是回文数. 思路 思路比较简单,首先将每一 ...

  4. Windows版本免费PyMol的安装

    技术背景 在前面一篇博客中,我们介绍过在Linux平台下安装和使用免费版本的PyMol.其实同样的这个免费版在Windows平台上(这里以win11为例)也是支持的. 安装流程 这个免费版本的PyMo ...

  5. 入门Vue+.NET 8 Web Api记录(一)

    做自己感觉有意思的或者能解决自己需求的项目作为入门,我觉得是有帮助的,不会觉得那么无聊. 一个最简单的前后端分离项目应该是怎么样的? 我觉得就是前端有个按钮,点击向后端发送一个get请求,获取到数据后 ...

  6. 仓颉编程语言技术指南:嵌套函数、Lambda 表达式、闭包

    本文分享自华为云社区<[华为鸿蒙开发技术]仓颉编程语言技术指南[嵌套函数.Lambda 表达式.闭包]>,作者:柠檬味拥抱. 仓颉编程语言(Cangjie)是一种面向全场景应用开发的通用编 ...

  7. FusionAccess liteAD

    回车回车 fusion access完成 进入access网页 https://IP:8443进入web网页 输入用户名:admin:密码:IaaS@PORTAL-CLOUD8! 输入完账号密码后改密 ...

  8. 记一次eclipse导入的JavaEE项目无法连接数据库的排查

    1.问题描述 Eclipse导入了一个JavaEE项目 在虚拟机环境中新建了一个数据库 数据库可以使用本地客户端工具正常连接 导入的JavaEE项目修改了数据源配置后无法启动 相同的数据源配置通过在I ...

  9. 局域网中linux和window共享文件方案——samba

    注明: 曾经写过:局域网中如何为Ubuntu20.04和window10共享文件,本文可以视作为该篇的续篇. 本文主要内容为Samba软件的安装和配置,以及相关的磁盘操作. 注意:(硬盘的UUID会受 ...

  10. 实验室深度学习服务器崩溃——Oops: 0000 [#1] SMP NOPTI

    这两天实验室的服务器总是崩溃,重启已经不能解决问题了,由于是跑深度学习的服务器,而且还是承接国家级项目的运行服务器,可以说是实验室的主要生产力了,给出报错的日志: Oct 16 09:42:33 ro ...