Topics

使用 Google Form 自訂功能進行輕量級垃圾郵件防護

  • column

根據許多客戶希望將網站的聯絡表單改用 Google Form 的需求,我們之前實施了 Google Form 客製化。

我們在專欄中整理並公開了這些內容,很感謝許多人都參考了!感謝大家。

使用 Google Form 建立客戶表單時的陷阱
Google Form 自訂確認畫面的實作

在這樣的情況下,我們收到了「大量垃圾郵件被發送過來,有沒有對策?」的請求。
這次作為 Google Form 專欄第三篇,我們整理了 Google Form 客製化的反垃圾郵件防護對策。

首先想到的對策是,是否可以導入 Google 提供的免費安全服務 reCAPTCHA?

但是,

Google 表單中不存在「啟用 reCAPTCHA」之類的標準設定或開關。在表單編輯畫面中也沒有這樣的選項,這是正確的認識——Google 並沒有官方提供這樣的功能。

經過進一步調查發現,Google Form 的 reCAPTCHA 是根據 Google 的判斷來運作的,無法確認 reCAPTCHA 標記是否會出現!

首先,Google Form 的客製化是將 entry.386122698 這類欄位 ID 輸入到 HTML 中,因此一切都以明文形式可見。只要知道這個 URL 和 entry ID,即使不通過瀏覽器開啟此頁面,也可以技術上直接透過 curl 或 Python 的 requests 等簡單指令碼向 formResponse 發送 POST 請求。

實際上,Google Form 的大部分垃圾郵件都是這種「繞過頁面直接調用端點」的模式,即使加入 reCAPTCHA 也是如此。除非在 GAS 等伺服器端進行令牌驗證,否則直接 POST 的路徑不會生效,無法根本解決問題。

不過,是有對策的!

實際上,也有許多垃圾機器人採用通用型「尋找聯絡表單→自動填入→送出」的方式(會實際渲染頁面,透過 DOM 送出表單的機器人)。

針對這類機器人,用 JavaScript 控制送出按鈕確實有一定的效果。若要提高精度,建議將多個機制組合使用。這些方法都只需要修改 HTML 檔案,Google 表單側和 GAS 側完全不需要變動。

參考:[reddit] 我如何防止機器人垃圾郵件轟炸我的 Google Form 並淹沒我的電子郵件?

1. 用 JavaScript 每次隨機生成兩個數字的加法題。

使用 Math.floor(Math.random()*9)+1 隨機生成簡單的計算式。每次頁面載入時,JavaScript 會隨機生成例如「3 + 5 = ?」這樣的數字題目並顯示在畫面上,送出按鈕會保持在停用狀態,直到使用者輸入正確答案後才能送出。

雖然這會給使用者增加一些麻煩,但通用型機器人往往不會真正反應 UI 外觀就直接按送出按鈕,因此容易遭到此機制的阻擋。

2. 以蜜罐欄位(隱形輸入欄)進行自動判定

用 CSS 將一個輸入欄放在畫面外,讓人眼看不見。人類使用表單時不會接觸到這個欄位,但機械式填入表單所有欄位後再送出的機器人會也在此欄位輸入值,因此可在送出時檢查該欄位是否有值,若有值就取消送出。

此方法對「機械式填入表單所有輸入欄位(無論是否可見)後送出」的機器人有效。這類機器人非常普遍,因此可以預期此對策會很有幫助。

由於可以偵測的機器人類型各不相同,將兩者結合使用的話,遺漏會更少。

「不經過頁面的直接POST型垃圾訊息」對於這一點仍然無法有效防止。

若網站頁面被繞過直接對Google表單發動垃圾攻擊,最終還是必須重新建立Google表單本身。

考慮到這一點,作為「針對部分常見機器人的緩解措施」來導入的話,應該相當有效吧!

本文作者

我主要從事標記語言、JavaScript、React 和 Next.js 的前端開發。看到自己參與的網站順利上線時最開心!興趣是彈吉他。喜歡貓咪和烤地瓜🐱🍠

Hiracchi

前端工程師 / 2022年入職

查看此員工的文章

信心十足的團隊體制與迅速的應對能力是我們的優勢

Liberogic 擁有經驗豐富的人員積極推進專案,因而獲得客戶的高度評價。
我們恰當地安排專案經理和總監,致力於順利推進整個專案。 我們避免不必要的全面投入而導致成本增加,而是採用適材適所配置資源的方式,因此在業務把握到估價制作與提交的速度上也備受好評。

※ 請注意,我們不積極進行 SES 形式的駐場業務。

Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webex 等幾乎所有主要的專案管理工具和聊天工具都可供您使用。

請諮詢我們解決您的網站問題。

案例分析