banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

【轉載】實際問題系列:公司短信接口被攻擊了,怎麼防止

title: 【轉載】實際問題系列:公司短信接口被攻擊了,怎麼防止
date: 2021-08-06 08:51:49
comment: false
toc: true
category:

  • 技巧
    tags:
  • 轉載
  • 攻擊
  • 防止
  • 短信
  • 接口
  • 問題

本文轉載自:實際問題系列:公司短信接口被攻擊了,怎麼防止


有了 QQ,微信之後短信的作用對個人好像沒有什麼特別的用處,平時朋友間的溝通都是通過微信 (也有 QQ),漸漸淡化了短信的用處。但是作為開發我們還是會接觸短信平台的。
短信現在的用處:

  • 網站和 app 的安全驗證 (註冊,登錄,修改密碼等)
  • 廣告推送騷擾
  • 生日祝福 (來自理財,保險,銀行)
  • 女朋友生
  • 還有自信賣 A 貨的 (感興趣的看文末)
  • .......

目前阿里雲,百度雲,騰訊雲都有自己的短信平台,而且我們的系統中也都集成了。

曾經我們正式環境系統配置的是其中一家短信平台,已經持續運行使用 2 年了。

在最近使用期間出現了一次被惡意發送好幾萬條短信 (最好在平台上開啟每日最大限制,我們沒開)。

我們的部分短信接口是 public 的 (忘記密碼和註冊功能),不需要授權即可直接 API 調用,而且我們系統中也是做了部分頻控的,但是沒有做 IP 的限制。

一個短信功能究竟該如何開發才能安全呢。

一句話:互聯網上沒有真正的安全,安全是相對的,就是儘可能提升攻擊者的代價。

新手:只考慮能不能發送,研究短信平台接口文檔,寫代碼調試,最終可以正常發送短信。寫業務相關代碼,相關信息存儲緩存,等待驗證,一個短信功能開發完成。

老手:研究短信平台接口文檔,寫代碼調試,可以正常發送短信。繼續封裝短信接口,增加頻控 例如短信發送間隔時間驗證碼過期時間同一帳號發送限制次數限制的間隔時間 等。配置如下

captcha:
    sms:
      # 短信驗證碼過期時間(分)
      expire: ${SMS_EXPIRE:5}
      # 驗證碼發送間隔時間(秒)
      interval: ${SMS_INTERVAL:60}
      # 同一個帳號發送次數限制
      limit-time: ${SMS_LIMIT_TIME:10}
      # 次數限制的間隔時間(時)
      limit-interval: ${SMS_LIMIT_INTERVAL:12}

還會增加接口調用 IP 限制 (防止同一個 IP 頻繁調用接口),然後寫業務代碼,完成開發。

還可以過濾一些無效的短信發送,如:

1. 手機號校驗#

手機號不合格的不發送,可以使用 google 的組件檢查,國內外手機號都可以校驗。

<dependency>
    <groupId>com.googlecode.libphonenumber</groupId>
    <artifactId>libphonenumber</artifactId>
    <version>8.12.6</version>
</dependency>

2. 註冊功能#

系統中已存在的不發送,在發送短信的時候校驗手機號是否已註冊,而不是真正註冊提交數據的時候再校驗。

3. 修改密碼#

系統中不存在的不發送,在發送驗證碼的時候校驗下手機號是否是系統中的用戶。

以上的方案只是對同一個手機號和 IP 做了頻控,但是如果攻擊者使用不斷更換 IP 給不同的手機號發送短信,那麼就無法避免短信的浪費和用戶的騷擾。

要解決就要使用圖形驗證碼 或者行為式驗證碼

圖形驗證碼較簡單,而且不需要花錢,自行開發程序就可以實現,效果如下
image

這種視覺上看起來很費勁而且需要增加用戶輸入操作,體驗不是很好,而且機器識別並解析其中的文字卻比較容易。如果想要增加機器識別的難度就需要增加圖片的模糊度,這樣用戶的錯誤率就更高了,體驗更差。

行為式驗證碼 到這就不得不提逢年過節買車票讓人抓狂的 12306 的圖片驗證,這是一種點觸式的,如下

image
image
還有目前更常用的方案是拖拽式的,如下

image
這種體驗上就比圖形要好很多,更方便美觀,背景圖還可以用來打廣告。

行為式驗證的核心思想是利用用戶的 “行為特徵” 來做驗證安全判別,通過機器學習,深度學習對人的行為特徵進行大量的分析。建立安全模型去區分人與機器程序。利用深度學習構建的神經網絡是可以不斷地自主學習的,在不斷的驗證過程中不斷的學習新的特徵分析 (來源百度百科)

一般企業沒有這個能力,需要花錢買

不想花錢也可以通過抠圖實現簡單的滑塊,服務端記錄滑塊抠圖的位置到圖片邊缘的距離,把原圖和滑塊給前端,前端在用戶滑動之後把滑動的距離傳給服務端,服務端通過對比用戶拖動滑塊的距離來驗證是否正確 (安全性不行)。

還有就是API 增加限流

總結#

  1. 頻控,增加短信發送間隔時間驗證碼過期時間同一帳號發送限制次數限制的間隔時間 控制。
  2. 增加 IP 調用接口的頻率。
  3. 通過校驗避免一些不必要的接口調用,像手機號格式校驗註冊功能:系統中已存在的不發送,修改密碼:系統中不存在的不發送
  4. 增加行為式驗證碼。
  5. 限流

還是那句話,沒有絕對的安全,安全是攻與防的較量。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。