點擊上方☝Java編程技術樂園,輕松關注!及時獲取有趣有料的技術文章
做一個積極的人
編碼、改bug、提升自己
我有一個樂園,面向編程,春暖花開!
將錯誤單獨截圖出來:
我剛才PC發了幾次驗證碼,這個地方設計還是考慮到安全性了,不錯。
我只能等待,在開發角度,這個就是在一個固定的時間周期內,我的手機號只能發固定次數的驗證碼,超過這個數量,就不會給我再發了,一個是安全考慮(接口頻繁調用),另一個可能也是費用考慮( 防止短信驗證碼被刷)。
過了一段時間,我在去手機端試著領取,發現一切順利,領取成功。
看到這裏的夥伴如果是新用戶,也對讀書有點興趣,那可以領取這個會員體驗一下(不是廣告)。地址:http://t.cn/AiFfyICx
到這裏本該就結束了,但是作爲一個開發人員,我覺得要簡單整理一下這個發短信的功能,因爲這個功能雖然看似簡單,裏面深究起來也有很多地方需要注意以及考慮的。
短信驗證碼設計總結
互聯網的時代,發送短信驗證碼已經作爲很多産品中必不可少的一個功能。用于的場景也是很多,如注冊登錄、銀行轉賬、營銷活動等(真的有很多場景,我就不多舉例了)。
那在發送驗證的時候,其實很多公司用的都是第三方的短信服務,這個短信的服務是需要收費的,天下沒有免費的午餐。那麽就出現 刷短信的黑工具——短信轟炸機 。
短信轟炸機就是一個利用寫好的程序來大批量刷短信的軟件,它能夠通過自動批量提交手機號、模擬IP等方式去刷短信。
如果 需要用到短信驗證碼的産品的時候,一定要制定限制規則 ,做好設計。
主要原則:發送驗證碼是前端和後台是需要共同設計的,這樣相對才能更加完善或者更加完美。
主要思路:
1、時間限制
xx秒後才能再次發送,常規操作
一般點擊驗證後,在前端(客戶端)會進行一個xx秒的倒數(這個倒計時可以根據具體産品具體業務定,很多是60s)。在這固定的時間內,用戶是無法提交多次發送信息的請求的。
具體時效限制要考慮産品本身屬性,操作難易度,網絡延遲,短信資費成本等。
2、圖形驗證碼限制 + 時間限制
(1)、在需要發送驗證的碼的時候,先讓用戶輸入驗證碼,當輸入的驗證碼通過後,才能請求獲取短信驗證碼,否則獲取驗證按鈕不激活。
(2)、在請求獲取驗證後,一般在前端(客戶端)會進行一個xx秒的倒數(這個倒計時可以根據具體産品具體業務定)。在這固定的時間內,用戶是無法提交多次發送信息的請求的。
這一點,圖形驗證碼不一定是必須的。可能爲了有更好的用戶體驗,一開始不需要輸入圖形驗證碼,在操作達到一定量之後,才需要輸入圖形驗證碼。具體情況請根據具體場景來進行設計。
這種方法雖然使用得比較普遍,但是卻不是非常有用,技術稍微好點的人完全可以繞過這個限制,直接發送短信驗證碼。
如果前台倒計時60s,後台驗證碼的失效時間設計肯定不能是60,一般會是5~10分鍾。
3、手機號+指定時間可以發短信次數限制
同一個手機號,指定時間之內不能夠超過x條。
對使用同一個手機號碼進行注冊或者其他發送短信驗證碼的操作的時候,系統可以對這個手機號碼進行限制,例如,1小時只能發送3條短信驗證碼,超出限制則進行報錯(如:系統繁忙,請稍後再試)。然而,這也只能夠避免人工手動刷短信而已,對于批量使用不同手機號碼來刷短信的機器,這種方法也是無可奈何的。
4、IP及Cookie限制
限制相同的IP/Cookie信息最大數量
使用Cookie或者IP,能夠簡單識別同一個用戶,然後對相同的用戶進行限制(如:xx時間內最多只能夠發送xx條短信)。然而,Cookie能夠清理、IP能夠模擬,而且IP還會出現局域網相同IP的情況,因此,在使用此方法的時候,應該根據具體情況來思考。
這樣在第三點的基礎上防止惡意刷手機驗證碼短信,如果同一個ip多次請求獲取手機驗證碼短信,因爲短信需要錢,競爭對手很可能惡意刷去。(我們對他人心懷善意,但是內心要有防備之心)
5、短信預警機制
監控短信服務,做好出問題之後的防護
以上的方法並不一定能夠完全杜絕短信被刷,因此,我們也應該做好短信的預警機制,即當短信的使用量達到一定量之後或者短信發送接口被超量調用,向管理員發送預警信息,管理員可以立刻對短信的接口情況進行監控和防護。
當我整理了相關的資料後,稍微明白了今天上文出現的問題,移動端驗證碼正常驗證成功,而PC端不能進行驗證的原因。可能是産品設計上的限制惡意刷短信,做了跨域請求限制。 也或許這就是一個bug(不讓程序員背鍋)。
後記
一個看似簡單的功能,要簡單做可以很簡單,要複雜也可以很複雜,作爲一個技術人員,了解業務,了解使用場景,了解用戶量等,全面考慮,多端的時代,兼容性等也要考慮。
其實這個問題如果可以仔細想清楚的話,如果以後遇到就能夠全面考慮,並且開發人員總是說自己做增刪查改,這個的功能設計好,裏面涉及了增刪查改,更涉及了一個開發對功能的設計能力。
做好每一個小的功能,從小的地方提升用戶體驗,是産品和開發共同的責任。
最後在說兩點,看到的朋友思考下:
1、後台應該如何處理驗證碼,保存在什麽地方,內存,緩存,還是數據庫?
2、怎麽樣的短信驗證碼用戶體驗好,內容和驗證碼長度?
歡迎留言,一起探討交流~