Topics

透過 Google Form 自訂實現輕量級垃圾郵件防護

  • column

根據客戶希望將網站的詢問表單改用 Google 表單的需求,我們之前實作了 Google 表單的自訂功能。

我們已在欄目中彙整並公開了相關內容,很幸運地有許多人參考使用,感謝各位!

建立 Google 表單時的常見陷阱
實作 Google 表單自訂的確認畫面

在這過程中,我們收到了關於大量垃圾郵件涌入的詢問,是否有相應的對策。
這次我們推出了 Google 表單欄目的第三篇,整理了 Google 表單自訂的垃圾郵件對策。

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

不過,

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

據此。進一步調查後發現,Google 表單中的 reCAPTCHA 是由 Google 判斷決定是否啟動的,因此無法預先確定 reCAPTCHA 標誌是否會出現!

首先,Google 表單的自訂是透過將 entry.386122698 這類的欄位 ID 輸入到 HTML 中,所以整個內容都以平文形式被看到。只要掌握了這個 URL 和 entry ID,在不開啟該頁面的情況下,從瀏覽器就可以直接透過 curl 或 Python requests 這類簡單的指令稿,直接向 formResponse 發送 POST 請求,在技術上是可行的。

實際上,Google 表單的垃圾郵件大多是這種「繞過頁面直接呼叫端點」的模式,即使加入 reCAPTCHA 也是一樣,除非在 GAS 等伺服器端進行權杖驗證,否則直接 POST 的途徑無法被攔截,不能根本解決問題。

但是,有解決的方法!

實際上,許多垃圾郵件機器人採用通用型「尋找聯絡表單、自動填入並提交」的方式(真正執行頁面呈現並透過 DOM 提交的機器人)。

針對這類型的機器人,使用 JS 控制提交按鈕確實有一定效果。若要提高精度,建議結合多種防護機制。這些做法都只需修改 HTML 檔案,完全不需觸碰 Google 表單端或 GAS 端。

參考資料:[reddit] How can I prevent bots from spamming my Google Form and flooding my email?

1. 使用 JS 每次隨機生成兩個數字的加法運算

Math.floor(Math.random()*9)+1 是兩個數字隨機相加的簡單計算式。每次頁面載入時,JS 會隨機產生例如「3 + 5 = ?」的數字題目並顯示在畫面上,使用者需正確輸入答案,否則提交按鈕會保持停用狀態。

雖然這對使用者造成一些不便,但這種方式對那些不會理解 UI 視覺回饋、直接點擊提交按鈕的通用型機器人特別有效。

2. 蜜罐欄位(隱藏輸入欄)自動判定

使用 CSS 將一個輸入欄位放在螢幕外,使其對人眼不可見。人類使用表單時不會接觸到這個欄位,但會機械式填入所有表單欄位的機器人會也填入此欄位。因此提交時若此欄位有內容,就取消提交。

這個方法對「不管欄位是否可見,機械式地逐一填入所有表單欄位後提交」的機器人特別有效。這類型機器人非常普遍,因此這個防護方式值得期待。

由於各種機器人類型的偵測能力不同,將兩者結合使用可以減少遺漏。

對於「不經由頁面的直接POST型垃圾訊息」,持續無法發揮效果的情況仍然不變。

若網站頁面被略過而Google Form遭受直接垃圾訊息攻擊,最終仍需要重新建立Google Form本身。

基於此前提,作為「針對部分常見機器人的緩解措施」而導入,應該相當有效吧!

本文作者

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

Hiracchi

前端工程師 / 2022年入職

查看此員工的文章

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

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

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

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

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

案例分析