前兩天講完基本的格式、語義檢查後,今天特別來講一下關於 email 的部分
大部分網站希望使用者留下 email 一來是避免使用者大量註冊,二來是日後可以透過這些 email 聯絡到使用者,所以這些 email 能不能確實達到他的效果就很重要了
首先來說說第一個「不希望使用者大量註冊」,很多網站在第一次註冊時會給一些優惠券,像第一次用 Google Cloud Platform(GCP) 時他就會送你 300 鎂的試用額度,所以他當然不希望你一直用不同的帳號去試用(300 鎂真的還不少XD)
但很不巧的是,Gmail 本身就有提供 sub account 的功能,譬如說 annie@gmail
跟 annie+1@gmail
雖然長得不一樣,但信確實會寄到同一個地方,而且除了加數字之外也可以改成 annie+beauty@gmail
。換句話說只要有一組 Gmail,你就有無限多組不一樣的信箱,所以怎麼防堵同一個使用者大量註冊就變成一個問題
很巧的是,昨天講的 validator(Node.js) 跟 govalidator(Go) 剛好可以幫忙解決這個問題,只要把使用者輸入的信箱丟進去做 normalize 之後就可以拿到正規化之後的信箱格式,也就可以防止這種基於 sub account 的大量註冊
// Node.js examples
validator.normalizeEmail("larrylu+handsome@gmail.com") // "larrylu@gmail.com"
validator.normalizeEmail("larrylu+123@outlook.com") // "larrylu@gmail.com"
// Go examples
govalidator.NormalizeEmail("hello+world@gmail.com") // "hello@gmail.com"
govalidator.NormalizeEmail("hello@googlemail.com") // "hello@gmail.com"
解決了子帳號的問題後,另外一個令人頭痛的問題是用完即丟的 email。現在只要上網搜尋 disposable/temp email
就可以找到很多類似的服務,這邊以搜尋結果第一名的 Temp Mail 作為例子
進到網站後就會看到他幫我隨機生成了一個臨時的 email,接著我用我真正的 email 寄一封 Larry is handsome
過去,不用幾秒馬上就可以在臨時的收件夾內收到
因為這種一次性的 email 實在太方便快速,日後也完全不會收到垃圾信,所以有越來越多人開始用這種 email 去註冊多組帳號
為了防止這種情況,我要跟大家介紹一個由 Kickbox 提供的 API,只要你發 GET 請求去打 https://open.kickbox.com/v1/disposable/{domain}
,他就會告訴你這個 email domain 是不是一次性的。譬如說我想驗證使用者填的 xxx@zwoho.com
是不是 disposable email,那下 curl https://open.kickbox.com/v1/disposable/zwoho.com
就可以知道 zwoho.com
是 disposable email,而 gmail.com
就不是
有了這個 API 後就可以有效防堵一些 disposable email,雖說這個 API 的結果不一定百分之百準確(可能有些比較新的臨時網域還沒被加入),但大部分情況還是可以辨識出來
今天介紹了兩個用來辨識 sub account 以及 disposable email 的方法,雖然這兩個方法不能完全防堵惡意的攻擊者進行大量註冊,但至少可以提高攻擊者的成本,從原本一個 gmail 打天下變成要尋找冷門的 disposable email,而且要自動化也會變得更麻煩,因此若是帶來的效益不夠大他們可能就懶得做了。