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 給不同的手機號發送短信,那麼就無法避免短信的浪費和用戶的騷擾。
要解決就要使用圖形驗證碼 或者行為式驗證碼
圖形驗證碼較簡單,而且不需要花錢,自行開發程序就可以實現,效果如下
這種視覺上看起來很費勁而且需要增加用戶輸入操作,體驗不是很好,而且機器識別並解析其中的文字卻比較容易。如果想要增加機器識別的難度就需要增加圖片的模糊度,這樣用戶的錯誤率就更高了,體驗更差。
行為式驗證碼 到這就不得不提逢年過節買車票讓人抓狂的 12306 的圖片驗證,這是一種點觸式的,如下
還有目前更常用的方案是拖拽式的,如下
這種體驗上就比圖形要好很多,更方便美觀,背景圖還可以用來打廣告。
行為式驗證的核心思想是利用用戶的 “行為特徵” 來做驗證安全判別,通過機器學習,深度學習對人的行為特徵進行大量的分析。建立安全模型去區分人與機器程序。利用深度學習構建的神經網絡是可以不斷地自主學習的,在不斷的驗證過程中不斷的學習新的特徵分析 (來源百度百科)
一般企業沒有這個能力,需要花錢買
不想花錢也可以通過抠圖實現簡單的滑塊,服務端記錄滑塊抠圖的位置到圖片邊缘的距離,把原圖和滑塊給前端,前端在用戶滑動之後把滑動的距離傳給服務端,服務端通過對比用戶拖動滑塊的距離來驗證是否正確 (安全性不行)。
還有就是API 增加限流
總結#
- 頻控,增加
短信發送間隔時間
,驗證碼過期時間
,同一帳號發送限制
,次數限制的間隔時間
控制。 - 增加 IP 調用接口的頻率。
- 通過校驗避免一些不必要的接口調用,像
手機號格式校驗
,註冊功能:系統中已存在的不發送
,修改密碼:系統中不存在的不發送
- 增加行為式驗證碼。
- 限流
“ 還是那句話,沒有絕對的安全,安全是攻與防的較量。 ”