如何防止驗證碼被攻擊?驗證碼可以用來攻擊單個用戶,也就是短信轟炸,也可以刷量增加網站成本,雖然一條幾分錢,但是量多了也是一種成本。以下幾種驗證碼被攻擊的解決方案。
1.發送間隔限制,每過60秒或120秒之后才可以再次發送
這個可以在前端限制點擊之后60秒內無法再次觸發事件。當然了后台也需要限制,
每次發送成功后,可以在redis里存儲一個字符串,key為手機號,value帶有時間戳。同一個手機號再次發送時先從redis里獲取字符串對比時間。
另外,這個字符串的過時時間也可用作驗證碼的有效時間,例如驗證碼5分鍾之內有效,那么字符串的有效時間就可以設置為5分鍾。
2.發送次數限制,每天只可以發送多少次
可以在redis內維護一條記錄,記錄的過期時間為24小時,value為此號碼發送短信的次數,每次發送前先獲取此號碼今天發送了多少次了,超過次數不發送。
3.同一個ip發送次數限制
這個做法和方法2類似,只不過把(號碼, 次數)換成了(ip,次數)。
4.增加圖片(或其他形式)的驗證碼
每次初始化時隨機生成一個圖片驗證碼存在session,在最后點擊發送之前需要驗證輸入的驗證碼是否正確,驗證碼使用一次后失效。
5.增加token
用戶提交請求時會攜帶token到后台,將緩存中的token和用戶請求帶過來的token進行比較,如果相同,會將緩存中的token進行更新。若用戶重復提交,則用戶之后發過來的請求的token和緩存中的token是不一致的,所以會導致之后的請求失敗。
==============================================================================================
短信驗證碼接口攻擊(短信轟炸)原理分析
==============================================================================================
短信驗證碼接口非常容易遭受互聯網惡意攻擊——“短信轟炸”,該攻擊通過循環利用不同業務中的無需注冊即可向任意手機號發送短信驗證碼的正常業務需求(如用戶注冊、密碼修改等),向多個手機號碼同時連續發送大量的驗證短信,對用戶造成困擾。下面對短信轟炸的原理進行具體分析,進而制定相應的安全防護方案。
短信轟炸原理
短信轟炸一般基於 WEB 方式,其由兩個模塊組成,包括:一個前端 Web 網頁,提供輸入被攻擊者手機號碼的輸入窗口;一個后台攻擊頁面(如 PHP),利用從各個網站上找到的短信驗證碼 URL 和前端輸入的被攻擊者手機號碼,發送 HTTP 請求,每次請求給用戶發送一條短信驗證碼。利用這兩個模塊實施“短信轟炸”攻擊,原理具體分析如下:
- 惡意攻擊者在前端頁面(下圖所示 )中輸入被攻擊者的手機號;
- 短信轟炸后台服務器,將該手機號與互聯網收集的可不需要經過認證即可發送短信的 URL 進行組合,形成可發送驗證碼短信的 URL 請求;
- 通過后台請求頁面,偽造用戶的請求發給不同的業務服務器;
- 業務服務器收到該請求后,發送短信驗證碼到被攻擊用戶的手機上。
這個過程如下圖 所示。
短信轟炸實例分析
用戶在某短信轟炸軟件上輸入被攻擊手機號、攻擊的次數后,對被攻擊的手機號進行攻擊的源碼如下圖所示。
該攻擊頁面中主要采用 img src="’http://…..’" / 來調用業務服務器短信發送的接口。如上圖紅框中內容所示:
- 在“短信轟炸”源代碼中,利用img標簽的 src 屬性定義了可以請求發送驗證碼短信的 URL(如 gd.12530.com/….);
- 在其中的 phonenumber 字段中嵌入被攻擊的手機號(如 13811111111)后,即可形成攻擊 URL;
- 頁面運行后,將其以 HTTP GET/POST 的方法提交給業務服務器;
- 業務服務器發送短信驗證碼到被攻擊者的手機上,從而完成了短信轟炸。