無論網站,還是App目前基本都是基於api接口模式的開發,那么api的安全就尤為重要了。目前攻擊最常見的就是“短信轟炸機”,由於短信接口驗證是App,網站檢驗用戶手機號最真實的途徑,使用短信驗證碼在提供便利的同時,也成了唄惡意攻擊的對象,那么如何才能防止被惡意調用呢?
1.圖形驗證碼:
將圖形校驗碼和手機驗證碼進行綁定,在用戶輸入手機號碼以后,需要輸入圖形校驗碼成功后才可以觸發短信驗證,這樣能比較有效的防止惡意攻擊。目前大部分應用都是采用這種方式。
2.限定請求次數:
在服務器端限定同IP,同設備,同時間范圍內的接口請求次數。比如同一號碼重復發送的時間間隔,一般為60或120秒;設置每個IP每天最大的發送量;設置單個手機號每天的最大發送量。
3.流程條件限定:
將手機短信驗證放在最后進行,比如需要用戶必須注冊后,或者用不必須填寫了某些條件才能進行短信驗證。
4.歸屬地是否一致:
服務器端檢查用戶的IP所在地與手機號歸屬地是否匹配,如果不匹配則提示用戶手動操作等。
5.服務器接口驗證:
當用戶登錄成功后,返回一個由Token簽名生成的秘鑰信息(Token可使用base64編碼和md5加密,可以放在請求的Header中),然后對每次后續請求進行Token的封裝生成,服務器端在驗證是否一致來判斷請求是否通過。
(1)常規的方法:用戶登陸后生成token,返回客戶端,然后服務器使用AOP攔截controller方法,校驗token的有效性,每次token是一樣的;
(2)用戶登陸后生成臨時token,存到服務器,並返回客戶端,客戶端下次請求時把此token傳到服務器,驗證token是否有效,有效就登陸成功,並生成新的token返回給客戶端,讓客戶端在下一次請求的時候再傳回進行判斷,如此重復。 這種方法有性能問題,但也有一個漏洞,如果用戶在一次請求后,還未進行下一次請求就已被黑客攔截到登錄信息並進行假冒登錄,他一樣可以登錄成功並使用戶強制下線,但這種方法已大大減少被假冒登錄的機會。
(3)兩層token:一般第一次用賬號密碼登錄服務器會返回兩個token,時效長短不一樣,短的時效過了之后,發送時效長的token重新獲取一個短時效,如果都過期,那么就需要重新登錄了。當然更復雜你還可以做三層token,按照業務分不同token。
6.采用https:
線上的api接口開啟https訪問,這樣做的話別人抓包的難度會提高很多,而且https需要秘鑰交換,可以在一定程度上鑒別是否偽造IP。
7.服務器端代理請求:
針對於網站,這也是解決跨域的方案之一,采用服務器代理可以有效的防止接口真實地址的暴露。
8.其它:
當接口存在大量肉雞攻擊的時候,攻擊者也同樣容易暴露意圖,我們可以通過系統分析算法,讓攻擊者獲取不到有效數據,提高攻擊成本。
總結:
安全問題一直都是與攻擊者之間智斗勇的問題,沒有一勞永逸的解決方法,只有不斷交鋒,不斷成長