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