摘要:不過今天寫的沒有上面說的那么高大,只是一個小小的防刷解決思路。這是工作中經(jīng)常遇到的在此僅做一個記錄,以便回顧。同一個限制一分鐘最多獲取次超過次則鎖定小時,鎖定期間獲取短信需加圖片驗證碼收到這個需求利用做了簡單的限流防刷功能。
一、寫在前面
在互聯(lián)網(wǎng)的發(fā)展史上,安全總是一個繞不開話題, 你有安全盾、我有破盾矛。所謂道高一尺、魔高一丈,不過互聯(lián)網(wǎng)安全也正是在這種攻防中慢慢的發(fā)展起來的。
不過今天寫的沒有上面說的那么高大,只是一個小小的防刷解決思路。
這是工作中經(jīng)常遇到的、在此僅做一個記錄,以便回顧。
如有不嚴(yán)謹(jǐn)或者不完善的地方,歡迎指正 ~謝謝~
二、場景引入、問題凸顯場景: 在我們給 xx 做的區(qū)塊鏈共享出行平臺中區(qū)塊鏈瀏覽器系統(tǒng)的登錄是以用戶的手機號+驗證碼來登錄的。
因是內(nèi)部用戶使用、在登錄這塊也沒做特殊的安全處理,導(dǎo)致在測試時被我們的測試小哥給刷爆了(在這給測試小哥點個贊)。
到這我們必然的收到一個bug了,業(yè)務(wù)期望。
1: 同一個ip限制一分鐘最多獲取5次
2: 超過5次則鎖定1小時,鎖定期間獲取短信需加圖片驗證碼
收到這個需求、利用Redis做了簡單的限流防刷功能。
三、解決方案首先分析需求,
1: 對同一IP做限制
2: 對單位時間內(nèi)次數(shù)做限制
利用Redis來實現(xiàn)思路
1: 一個獲取短信驗證碼請求過來我們首先的判斷此IP是否已經(jīng)被鎖定(單位時間內(nèi)超過了限定的訪問次數(shù))
2: 如果未被鎖定則判斷此IP是否是首次訪問,如果是則給此IP加個生命周期以及記錄訪問次數(shù)。
3: 如果不是首次訪問,則判斷單位時間內(nèi)是否符合限制要求。
完成這三不我們需要在 redis 中定義三個KEY
msg_lock_key_{ip} 記錄次IP已被鎖定
msg_time_key_{ip} 記錄單位時間內(nèi)IP
msg_counter_key_{ip} 記錄單位時間內(nèi)IP訪問次數(shù)
到這就直接上一段代碼吧,
public boolean checkMsgFrequency(String remotIp) { String romteIpString = remotIp.replace(".", ""); // 1: 判斷此ip是否已經(jīng)被限制 String msgLockKey = Constants.API_MSG_LOCK_KEY + romteIpString; if (jedis.exists(msgLockKey)) { // 此ip已經(jīng)被鎖住 logger.info("此Ip[{}]以超過規(guī)定訪問頻率key:{}", remotIp, msgLockKey); return false; } // 2: 判斷此ip是否在規(guī)定的時間內(nèi)訪問過 String msgTimeKey = Constants.API_MSG_TIME_KEY + romteIpString; String msgCounterKey = Constants.API_MSG_COUNTER_KEY + romteIpString; // key 不存在 if (!jedis.exists(msgTimeKey)) { // 加入緩存 jedis.setEx(msgTimeKey, "0", imageCode.getLimitTime()); jedis.setEx(msgCounterKey, "1", imageCode.getLimitTime()); } if (jedis.exists(msgTimeKey) && (jedis.incrBy(msgCounterKey, 1) > imageCode.getLimitCounter())) { logger.info("此Ip[{}]以超過規(guī)定訪問頻率、進(jìn)行枷鎖key:{}", remotIp, msgTimeKey); jedis.setEx(msgLockKey, "0", imageCode.getLimitlockTime()); return false; } return true; }
這是一個簡單的代碼實現(xiàn), 邏輯就是這個邏輯,實現(xiàn)方式很多種。
你可以使用spring AOP + 自定義注解對邏輯進(jìn)行分裝。
也可以使用Redis + lua腳本對上述三步邏輯進(jìn)行分裝。
這個就看個人,重要的的理解實現(xiàn)的思路, 實現(xiàn)方式千萬種總有一種是適合你的。
四、總結(jié)對稀有資源的限流防刷,一般對單位時間的訪問頻率或者次數(shù)的限制。
我們主要是理解其解決問題的思路, 而不是記住實現(xiàn)代碼。
主要思路:
1: 查看針對次請求(IP 或者 uid) 對當(dāng)前請求資源是否已被鎖定。
2: 如果沒有被鎖定,則給此請求加生命周期(也就是一個限制時間單位),同時記錄訪問次數(shù)。
3: 則判斷此請求是否達(dá)到鎖定條件
大致思想就是這三步。
此記錄為加深自己記憶,同時以便溫故,若能幫到你,萬分高興。如有不對的地方歡迎留言指正 謝謝!
如您有更好的思路歡迎交流
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/74705.html
摘要:產(chǎn)品簡介無間盾是一款驗證碼產(chǎn)品,提供了拖動點選兩種形式的驗證碼。計費周期服務(wù)點數(shù)具有年有效期,以最近次購買次數(shù)為準(zhǔn)。【產(chǎn)品簡介】無間盾是一款驗證碼產(chǎn)品,提供了拖動、點選兩種形式的驗證碼。基于生物的行為特征,結(jié)合人工智能技術(shù),在降低用戶操作的難度的同時,有效防范羊毛黨、垃圾注冊、刷單、惡意評論、撞庫等業(yè)務(wù)風(fēng)險,保障業(yè)務(wù)的安全性,降低黑產(chǎn)團(tuán)伙、自動化工具等欺詐行為帶來的業(yè)務(wù)損失。【應(yīng)用場景】1、...
摘要:在次失敗后,第四次請求,就返回錯誤文案驗證碼連續(xù)錯誤三次,請重新獲取短信驗證碼還有一個需要思考的維度。一般來說,短信驗證碼會有分鐘的有效期。 前言: 現(xiàn)如今登錄用手機驗證碼登錄是越來越常見了。雖然會增加成本,不過對用戶體驗的提升還是很有幫助的。那么,當(dāng)產(chǎn)品經(jīng)理對開發(fā)說,來按照這個原型給我搞個短信驗證碼登錄的時候。我們作為研發(fā),應(yīng)該想些什么?showImg(https://upload-...
摘要:,大家好,很榮幸有這個機會可以通過寫博文的方式,把這些年在后端開發(fā)過程中總結(jié)沉淀下來的經(jīng)驗和設(shè)計思路分享出來模塊化設(shè)計根據(jù)業(yè)務(wù)場景,將業(yè)務(wù)抽離成獨立模塊,對外通過接口提供服務(wù),減少系統(tǒng)復(fù)雜度和耦合度,實現(xiàn)可復(fù)用,易維護(hù),易拓展項目中實踐例子 Hi,大家好,很榮幸有這個機會可以通過寫博文的方式,把這些年在后端開發(fā)過程中總結(jié)沉淀下來的經(jīng)驗和設(shè)計思路分享出來 模塊化設(shè)計 根據(jù)業(yè)務(wù)場景,將業(yè)務(wù)...
閱讀 2898·2021-10-27 14:19
閱讀 536·2021-10-18 13:29
閱讀 1127·2021-07-29 13:56
閱讀 3546·2019-08-30 13:19
閱讀 1926·2019-08-29 12:50
閱讀 1034·2019-08-23 18:16
閱讀 3520·2019-08-22 15:37
閱讀 1897·2019-08-22 15:37