3

hCaptcha 筆記與部落格留言機制調整公告

 4 months ago
source link: https://blog.darkthread.net/blog/hcaptcha/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

hCaptcha 筆記與部落格留言機制調整公告-黑暗執行緒

我的部落格這半年來不知為何被印尼的廣告留言廠商盯上,三不五時會跑來留一些印尼文垃圾留言(大多是吃角子老虎、線上賭場... 之類博弈類廣告,但有次是升學求職家教,跨度挺大),頻率一週一兩次,每次會隨機挑五六篇留言,每則間隔一兩分鐘,印尼文居多,但也看過一兩次英文版。

Fig1_638394938343875700.png

推測對方有花了點心思,破解掉我防君子不防小人的陽春版加減計算 CAPTCHA,想說既然投資了就要定期採收。我推測是機器人的理由是 - 對方只管貼,根本沒注意到我加了審核關卡,貼了沒人看得到是在貼心酸?

Fig2_638394938347490931.png

想了一些防堵手法。

用 ChatGPT 判斷?酷歸酷,但有成本考量。

Fig3_638394938349335529.png

依據來源 IP 的留言時間隔判斷?有誤判可能,讀者馬上留言補充還挺常見,我自己就常這樣。

評估使用機器學習演算法(隨機森林、支援向量機、貝式分類)及自定義啟發式演算法(N-Grams),蒐集網路垃圾留言進行訓練,建立 AI 阻擋機制... (別鬧了)

最後,決定別把簡單的事複雜化搞死自己,回歸傳統把 reCAPTCHA 裝起來吧。動手前,向兩位有重度 CAPTCHA 使用經驗的前輩請益,小熊子推薦我一個新選項 - hCaptcha

看了一下,hCaptcha 使用方式宇宙無敵簡單,用 Github 或 Google 帳號註冊,新增站台取得 Site Key (免費方案一個月一百萬次,不用鎖定網域名稱),在個人設定可查到 Secret。

前端只要加兩行:

<script src="https://js.hcaptcha.com/1/api.js" async defer></script>

<form>
    <div class="h-captcha" data-sitekey="your_site_key"></div>
</form>

POST 表單回 ASP.NET Core 時,會自動加送一個 h-captcha-response 參數,用 Request.Form 讀取以 application/x-www-form-urlencoded 格式送出 Secret 及 Token,由回傳 JSON 的 success 屬性 true/false 判斷即可,比 reCaptcha 簡單許多。用 ASP.NET Core 寫的話,大約會像這樣:
(讓我想到 Angular 跟 Vue 的風格差異,Angular 架構完整考慮嚴謹,堪稱教科書等級,但有時我沒有要蓋 101,只想搭間小屋快點有地方遮蔭 😄)

var hcatpchaToken = Request.Form["h-captcha-response"];
try
{
   if (string.IsNullOrEmpty(hcaptchaToken)) 
        throw new ApplicationException("Please fill hCaptcha ");
   var form = new Dictionary<string, string>
   {
       { "secret", _your_hcaptcha_secret_ },
       { "response", hcatpchaToken }
   };
   var res = await httpClientSinglton.PostAsync("https://hcaptcha.com/siteverify",
       new FormUrlEncodedContent(form));
   res.EnsureSuccessStatusCode();
   var json = await res.Content.ReadFromJsonAsync<Dictionary<string, object>>();
   if (!((System.Text.Json.JsonElement)json["success"]).GetBoolean()) 
        throw new ApplicationException("Failed to pass hCaptcha");
}
catch (Exception ex)
{
   throw new ApplicationException("hCaptcha error: " + ex.Message);
}

總之,大會報告:部落格留言的防機器人檢查我換成 hCaptcha 了(原本想同時保留加減運算的,雙重 CAPTCHA 效果加倍,但怕造成新同學混淆作罷),大家如果有遇到什麼困難請再回報。

Fig4_638394938351130638.png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK