2016-05-11

captcha 之必要性與修正

這邊只寫下開發歷經的過程,沒實際 code

在開發時遇到的需求,類似太簡單的 captcha 會被破解( ... 自己破解自己成功 ... ),太困難的 captcha 很好用但其實很擾人,然而這就是辯思之旅,captcha 存在必要的與否

captcha 的存在必要性其實是針對機器人的防止,防止的是對『下個動作的操作』,類似登入或發文系統通常有 captcha,原因是防止登入測試與機器人發廣告信

而目前系統的問題發生在登入時,所以是怕被機器人 try 帳號密碼

分析『 try 帳號密碼 』這件事情,所得到的影響的其實是『頻率』與『對象』這兩個因素,所以只需針對這兩個因素來完成即可

中間過程略過,其實將 IP 與帳號來視為危險來源與保護對象即可,目前所想得到的最完美解為類似
  1. 該 IP 期間內是否登入錯誤太多次,否則直接顯示
  2. 使用者輸入帳號後,Ajax 到後端檢查該帳號期間內是否登入錯誤太多次,而需要顯示 captcha,如果需要則回傳 captcha 資訊並顯示
然後定義『期間』與『峰值』,就可以解決『頻率』與『對象』這回事,然而還有新的問題,類似如果遭受到 DDOS 且無差別攻擊時(無特定對象的帳號)該怎麼辦?也就是在一個來源 IP 無限且對象不定的狀況之下

這個問題其實是總量管制的意思,類似高速公路塞滿了車,則實施高承載管制來提高效率,所以再訂定了一個新的規則,類似
  1. 設定時間區間為 segment counter,每次登入錯誤時就把目前的 counter + 1,目前這個 segment 的初始值是上個 segment x 0.8 來做退火,判斷使用目前和上個 segment 的錯誤總數是否到達峰值
這樣遭到 DDOS 來破解帳號密碼時,也會自動啟動全站防護機制,而退火和判斷有依據上個 segment,原因是當此 segment 退火後,該時段攻擊機器人觀察到後又馬上攻擊,會出現很糟糕的鋸齒狀曲線的攻擊次數,雖然避免不了,但是至少可以平滑很多就是


目前分析至此,希望這樣就夠了,還有變更再另外更新

沒有留言:

張貼留言