iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
Security

從以卵擊石到堅若磐石之 Web API 安全性全攻略系列 第 4

Day04-入口管制(三)

前言

前兩天講完基本的格式、語義檢查後,今天特別來講一下關於 email 的部分

大部分網站希望使用者留下 email 一來是避免使用者大量註冊,二來是日後可以透過這些 email 聯絡到使用者,所以這些 email 能不能確實達到他的效果就很重要了

Sub Account

首先來說說第一個「不希望使用者大量註冊」,很多網站在第一次註冊時會給一些優惠券,像第一次用 Google Cloud Platform(GCP) 時他就會送你 300 鎂的試用額度,所以他當然不希望你一直用不同的帳號去試用(300 鎂真的還不少XD)

但很不巧的是,Gmail 本身就有提供 sub account 的功能,譬如說 larrylu86@gmaillarrylu86+1@gmail 雖然長得不一樣,但信確實會寄到同一個地方,而且除了加數字之外也可以改成 larrylu86+handsome@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"

Disposable Email

解決了子帳號的問題後,另外一個令人頭痛的問題是用完即丟的 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,而且要自動化也會變得更麻煩,因此若是帶來的效益不夠大他們可能就懶得做了。


上一篇
Day03-入口管制(二)
下一篇
Day05-入口管制(四)
系列文
從以卵擊石到堅若磐石之 Web API 安全性全攻略30

尚未有邦友留言

立即登入留言