ReCAPTCHA Enterprise 教學

reCAPTCHA uses an advanced risk analysis engine and adaptive challenges to keep malicious software from engaging in abusive activities on your website. Meanwhile, legitimate users will be able to login, make purchases, view pages, or create accounts and fake users will be blocked.

昨天重看 Google reCAPTCHA 文件,在 FAQ 頁看到有一條 Are there any QPS or daily limits on my use of reCAPTCHA? 裡面有提到,

If you wish to make more than 1k calls per second or 1m calls per month, you must use reCAPTCHA Enterprise or fill out this form and wait for an exception approval.

原來 reCAPTCHA 是有使用上限的,而且還出了 Enterprise 版。雖然文件上也沒說明如果超過用量會發生什麼事情,但有明確提到如果用量會超過,請改用 Enterprise 版,或是填個申請表向 Google 提高上限。然後 Enterprise 網站寫的上限也很有趣,預設是每分鐘 6000 次。

Enterprise 還是處於 beta 階段,文件的更新時間是在 2019 年五月份,查了一下相關資料,有少量幾個英文網站在四、五月份有提到,但都沒看到中文華語圈有在討論報導。感覺 Google 對於 reCAPTCHA Enterprise 是走很低調的路線。

reCAPTCHA 在 2009 年推出第一代,2014 年推出第二代,2019 年推出第三代,經過十年,用的網站夠多了,收集的資料也足夠,Google 想要變現,就是把他納入 GCP ,包裝成一項資安產品。

卡內基美濃大學於 2002 年開發出的 reCAPTCHA 系統,是在將書籍數位化的過程中,把那些無法用光學辨識技術辨別的文字存成檔案 – CAPTCHA,讓人類去辨別其中的文字,來區分真人或機器人。(可以辨識 CAPTCHA 的就是真人,不能的則為機器)

而 Google 在 2009 年收購 reCAPTCHA 後,推出第一代的 Google reCAPTCHA,透過「風險分析」和「設置挑戰」來區別機器人與人類,進而保護網站免於惡意程式的侵擾。

最初代是用文字輸入的方式來辨別使用者是否為機器人,但隨著技術進步,第一代被淘汰,轉而出現了第二代及第三代的 reCAPTCHA (第三段詳細說明)。

PS. 如果以上你看不太懂,可以參考這篇報導,寫得非常白話好懂:為什麼只要勾選「我不是機器人」,Google 就知道你不是機器人?

CAPTCHA 與 reCAPTCHA 差異

1. CAPTCHA

全名為「全自動區分電腦和人類的公開圖靈測試 (Completely Automated Public Turing test to tell Computers and Humans Apart)」,俗稱「驗證碼」。

用生活化一點的方式說明,就是填寫完表單後,會請你輸入圖片中英文數字的技術,用這種方式來判別你是不是機器人。(最初就是這樣來辨別是否為機器人的)

ReCAPTCHA Enterprise 教學

2. reCAPTCHA

如本段開頭所說,reCAPTCHA 原本是書籍數位化過程中延伸出的一種技術,後來被 Google 收購後加以改良,開發出新的工具技術。

從原本的「手動文字驗證」,到後來的「手動圖片驗證」,現在則能夠直接用「分數計算」的方式自動驗證,讓使用者在使用上變得更加方便。

ReCAPTCHA Enterprise 教學

Google reCAPTCHA 版本種類

撇除掉 Google reCAPTCHA v1 已經被淘汰外,現在市面上還可以使用的技術有 Google reCAPTCHA v2、Google reCAPTCHA v3,以及最新的 Google reCAPTCHA Enterprise。

10 年前舊版部落格 CAPTCHA 被攻破遭人狂塞垃圾留言,當時換成卡內基美隆大學發明,能有效阻擋機器人兼邀請人類參與古代書籍數位化的 reCAPTCHA,但第一代 reCAPTCHA 疑似被破解,後來才換成自己寫的陽春版加減計算 CAPTCHA。(防護力跟 reCAPTCHA 無法相提並論,但冷門又無利可圖也是種抗體)

2009 reCAPTCHA 被 Google 收購,讓它替大家數位化 18 世紀以來的「紐約時報」以及 Google Books。2014 Google 想出好點子(noCAPTCHA reCAPTCHA),用「勾一下"我不是機器人"」取代歪七扭八鬼才看得懂的英數字頗受好評。過去的扭曲文字圖案為了抵抗日益強大的 AI,導致人類答對率只有 33%、電腦反而能答對 99% 的扭曲結果。noCAPTCHA 採用另一種戰略,在點選「我不是機器人」時傳送一組資料到 Google 伺服器,包含 Google 偷偷記錄的 IP 位址、國家、時間,以及打勾之前的滑鼠軌跡、網頁捲動紀錄等,藉此分析背後是真人操作還是自動程式,遇到無法確定時再祭出圖片挑選挑戰: 參考資料:為什麼只要勾選「我不是機器人」,Google 就知道你不是機器人? by 科技報橘

ReCAPTCHA Enterprise 教學

(傳說中的大魔王挑戰題)

最近跟人討論到 reCAPTCHA,事隔多年,當年知識已不敷使用,故再整理筆記一篇以備不時之需。

reCAPTCHA 版本

目前 reCAPTCHA 共有 v2、v3、Enterprise 三種版本。

v2 除了我們熟知的「我不是機器人」勾選方塊,還有一種隱形模式,用點擊原本登入或送出鈕時取代勾選我不是機器人動作,另外 v2 也有給 Android APP 的版本。

v3 則沒有「我不是機器人」勾選方塊,以純 JavaScript 回傳一個真人指標,1.0 代表操作自然很像真人,0.0 意味極有可能是機器人,程式端再可此決定要不要啟動第二因素(簡訊、OTP)認證等額外驗證機制,使用 v3 必須搭配自訂驗證關卡,實作上較麻煩。

至於 Enterprise 版,則多了風險模型、機器學習模型、Android/iOS SDK、高精確度風險指標... 等進階功能,並提供技術支援。另外,v2/v3 有每個月一百萬次的使用上限,若用量大於一百萬,Enterprise 是唯一選擇。Enterprise 有每月一百萬次的免費額度,超過上限一千萬次以下每 1000 次收費一美元,超過一千萬次請電洽。

一般中小型應用,v2 應是較簡便的選擇。

【參考資料】

  • Choosing the type of reCAPTCHA
  • reCAPTCHA Enterprise pricing

reCAPTCHA Key

要使用 reCAPTCHA 需先申請兩支 API Key,一支寫在前端 HTML 裡,另一支呼叫 Google API 取得驗證結果要用。申請網站在 https://www.google.com/recaptcha/admin,使用 Gmail 帳號登入,若從未申請過會跳到註冊新網站頁面:

  1. 識別這組 Key 用的標籤文字
  2. reCAPTCHA 類型
  3. 應用網域(方便本機測試可加 localhost)
  4. 登入 Gmail 是預設擁有者,可加入其他管理者
  5. 需接受服務條款(同意啦,哪次不同意?)
  6. 發生問題或流量異常時發送通知

ReCAPTCHA Enterprise 教學

申請好再次登入 https://www.google.com/recaptcha/admin 會進入管理晝面,若你有多組 Key,可從左邊清單選取標籤,右邊齒輪圖示點下去可修改設定及查看 API Key:

ReCAPTCHA Enterprise 教學

Key 有兩組,上面的寫在 HTML 裡,下面的用在 Server 端呼叫 Google API 時:

ReCAPTCHA Enterprise 教學

在網頁加入 reCAPTCHA

終於到了開心的 Coding 時間。我用 ASPX 示範,大家直接看 Code 吧,程式很簡單,我就不多廢話了。

<%@ Page Language="C#" %>
<%@ Import Namespace="Newtonsoft.Json" %>
<%@ Import Namespace="Newtonsoft.Json.Linq" %>
<script runat="server">
protected string Message = "";
void Page_Load(object sender, EventArgs e)
{
	if (Request.HttpMethod == "POST") 
	{
		var apiKey = "6LeH...oWsC";
		var url = "https://www.google.com/recaptcha/api/siteverify";
		var wc = new System.Net.WebClient();
		wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
		var data = "secret=" + apiKey + "&response=" + Request.Form["g-recaptcha-response"];
		var json = wc.UploadString(url, data);
		// JSON 反序化取 .success 屬性 true/false 判斷
		var success = JsonConvert.DeserializeObject<JObject>(json).Value<bool>("success");
		if (!success) {
			Message = "驗證碼有誤";
			return;
		}
		// TODO: 檢查帳號密碼
		Message = "確認過眼神,你不是機器人,但程式還沒完成";
	}
}
</script>

<!DOCTYPE html>

<html>
<head>
	<meta charset="utf-8">
	<title>reCaptcha Test</title>
	<script src="https://www.google.com/recaptcha/api.js" async defer></script>
	<style>
		form > div { padding: 6px; font-size: 10pt; }
		div.msg { color: orangered; }
	</style>
</head>
<body>
	<form method="post">
		<div>帳號:<input type="text" name="acnt" placeholder="Username" /></div>
		<div>密碼:<input type="password" name="pwd" /></div>
		<div class="g-recaptcha" data-sitekey="6LeH...T2d0"></div>
		<div><button>登入</button></div>
		<div class="msg"><%= Message %></div>
	</form>
</body>
</html>

ReCAPTCHA Enterprise 教學

防火牆設定

由於伺服器與呼叫 Google WebAPI,若伺服器位於網路受限環境,需開通防火牆,參考 Google 文件,可由 https://www.gstatic.com/ipranges/goog.json 取得完整 IP 網段清單。