reCaptcha 越來越令人討厭,我們有什麼替代品?

Google 的 reCaptcha 是網站用來辨別訪客是否真人的工具,我在多年前曾經推介過它,認為 reCaptcha 既能有效防止濫發文章,又容易安裝,還能對公益事業作出貢獻。Google 在 2009 年收購了 reCaptcha 後大力推廣,現已成為最普遍使用的 Captcha 工具。很可惜 reCaptcha 現在變得越來越難辨認,網上不少人高呼「reCaptcha 令人討厭」,也有人認為 reCaptcha 令網站的使用率下降,reCaptcha 原來的公益成份在被 Google 收購後也變了質,現在解讀 reCaptcha 等於無償替 Google 當人肉 OCR,包括辨別 Google 街景圖中的文字。反對 reCaptcha 的氣氛在用戶和網站站長之間迅速蔓延,大家紛紛尋求 reCaptcha 的替代品。

良好 Captcha 的條件

良好的 Captcha 必須:

  1. 真人很容易解答
  2. 任何真人都能夠解答
  3. 機器人很難,甚至無法解答
  4. 很容易輸入解答

reCaptcha 圖像

reCaptcha 顯然通過不了第一個條件。

其實幾乎任何以文字辨識為基礎的 Captcha 都不符合第一個條件,因為它與第三個條件相沖。為了令機器人無法辨識圖像中的文字,大家想出了不同的方案,包括把文字扭曲,旋轉,拉長,壓扁,插入擾亂視覺的線條和圖案等等,無所不用其極,最終成了 reCaptcha 現在的模樣:連真人也無法辨識。

其他以圖像辨識為基礎的 Captcha 方案

使用圖像的 Captcha 其實還有其他路可走,Microsoft 的 Asirra 系統要求用戶在 12 幅貓和狗的圖像中,辨別哪些是貓哪些是狗,這個方案比文字辨識有以下好處:

  1. 真人通常辨認圖像比辨認文字容易
  2. 沒有語言上的限制
  3. 貓和狗都是常見的動物,幾乎任何人都可以毫無困難地分辨它們
  4. 貓和狗的相貌和外形十分相似,機器人極難分辨它們
  5. 大部份人喜歡看貓和狗的圖像多於一幅充滿古怪扭曲文字的圖像

Asirra 圖像

但它也有缺點:

  1. Asirra 所用的圖片集中儲存在伺服器上,萬一伺服器被黑客入侵取得圖像,Asirra 等於被破解了
  2. Asirra 佔用的頁面空間比以辨認文字為基礎的 Captcha 多,在桌面電腦的瀏覽器上還可以接受,但用在流動裝置的瀏覽器便太勉強了

Asirra 跟 reCaptcha 一樣是免費的網上服務,很多開放源碼的系統包括 MediaWikiWordPress 都有 Asirra 插件。

有些網站基於本身的業務特性,創造了獨特的 Captcha 方案,例如 Facebook 的 Captcha 會隨機顯示你的好友的圖片,要你辨認他們。這些方案難以推廣到其他網站,即使 Facebook 願意把這項服務跟其他網站分享,也不適合沒有 Facebook 賬號的訪客,所以這兒不討論了。

任務式 Captcha 方案

使用圖像的 Captcha 不一定要辨識文字或動物或什麼東西,也可以是執行指定的任務,例如 jQuery 的 Ajax Fancy Captcha 插件會顯示數個圖像,要求訪客把指定的一個拖拉到目標區域。

jQuery Ajax Fancy Captcha

隨便搜尋一下便可以找到很多這種任務式的 Captcha,這些方案明顯比 reCaptcha 人性化,更容易令人接受,但為什麼使用 reCaptcha 的網站仍然佔絕大多數?可能的原因是:

  1. 插入 reCaptcha 非常簡單容易,Google 提供大量不同語言的編程範例,幾乎所有開源的套裝軟件都有 reCaptcha 插件,採用 reCaptcha 的門檻很低
  2. 編寫任務式的 Captcha 一般需要高難度的 JavaScript 技術
  3. 即使採用了 JavaScript 函式庫 (例如 jQuery) 和預製的 Captcha 插件,瀏覽器也需要下載大量 JavaScript 程式,減慢頁面的載入速度
  4. 當大部份人都用 reCaptcha,還沒採用 reCaptcha 的網主開始對自己的信心動搖,跟著改為使用 reCaptcha

採用這些 Captcha 方案之前,必須考慮它們是否真的能夠杜絕機器人。表面看來因為機器人不理解任務的內容,並且使用滑鼠完成任務,所以機器人無法通過考驗。但若果這些 Captcha 的使用率達到一個足夠高的水平,便會吸引足夠多有能力的黑客攻擊它們,尋找它們的破綻。換句話說,這些 Captcah 還沒有被破解,未必因為它們的技術和設計比其他方案優勝,只是因為沒有足夠的誘因吸引高手黑客攻擊它們。

JavaScript Captcha 方案

除了以圖像為基礎的 Captcha 方案,很多人設計出其他分辨真人和機器人的方法,例如 jQuery 的教學文件便討論到一個使用 JavaScript 的方案,這個方案的特色是完全無需用戶解答任何難題,他們甚至不察覺網頁包含了一個 Captcha 方案,所以對用戶的使用體驗絲毫無損。這不正是一個完美無瑕的 Captcha?

這個方案的原理是使用 JavaScript 量度用戶輸入網頁表單所需的時間,機器人通常在一瞬間把所有欄位填好然後提交給伺服器,真人通常需要較長時間,伺服器就是透過檢視填表的時間判斷用戶是真人還是機器人。

不過只要查看一下網頁的程式碼便很容易知道它的運作原理,製作破解這種 Captcha 的機器人也十分簡單,初入門的程式編寫人員也很容易辦到,所以對於低流量、低價值的網站還可以一試,稍有價值的網站都不會採用這種方案。

陷阱欄位 Captcha 方案

機器人酷愛網頁表單,它們會在網上瘋狂尋找各式各樣的表單:用戶註冊表單、發表文章的表單、發表回饋的表單等等,對於表單中的欄位也有一種不能自控的執著,就是要把所有欄位填滿。於是有人想到使用「陷阱欄位」,意思是在表單中加入一個文字輸入的欄位,然後在頁面上指示用戶不要輸入任何東西,或者使用 CSS 把該欄位隱藏掉。伺服器若果發現個欄位有輸入,便判斷對方是機器人。

這個方案跟前面的 JavaScript 方案一樣,表面看來非常理想,對用戶的騷擾也很輕微,甚至完全沒有,但卻有同樣的缺點,就是很容易被識破,製作針對性的機器人也十分簡單。

解答問題式的 Captcha 方案

機器人一般都不懂得理解人類的語言,不懂得思考和解答問題,於是便有人想到要求用戶解答一些簡單的問題,例如「天空是什麼顏色?」、「人有多少隻手?」、「老毛是一個魔頭,老毛是什麼?」、「長城長城長城,請輸入網絡封鎖」等等,問題的設計需要考慮用戶群的國家、文化背景、語言等等,一個面對全球用戶的網站可能特別費煞思量。

有些網站要求用戶解答一個簡單的數學問題,例如「3 + 5 = ?」或「4 * 2 – 2 = ?」,但是這種 Captcha 很容易破解,另一個變種是用文字代替運算符號,例如「3 加 5 是多少?」或「4 乘 2 加 2 是多少?」,不過是用正規表達式很容便可以把它轉換成一般的數學算式,所以用處也不大。

有些網站會提出一個非常艱深的問題,不要說機器人,真人也沒有幾個有能力解答:

數學 Captcha

怎辦呢?原來只要你把頁面刷新便有機會看到一道簡單得多的問題,機器人不懂得解答這道問題,也不知道可以刷新頁面,就此被卡住了。

Captcha 是解決問題的正確手段嗎?

研究了那麼多各式各樣的 Captcha 方案,讓我們回到原本要解決的問題:防止機器人在網站上瞎搞。那麼說,Captcha 是唯一的手段嗎?是正確的手段嗎?

我們的確有 Captcha 以外的手段,例如在伺服器檢查用戶送來的資料,判斷對方是否機器人,有一些網上服務例如 Akismet 可以免費替網站判斷訪客的留言是否垃圾,我們也可以限制沒有登入的訪客只能瀏覽不能發言,又或者限制訪客發言的數量,例如每個網絡地址 (IP 地址) 或對話 (session) 每小時只能發言一次。若果能把這些手段混合使用,相信在不影響真正用戶之餘,也能消除很多機器人的騷擾。