日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

從Web登錄限流看Api限流

時(shí)間:2018-07-09 16:12:58 類型:PHP
字號(hào):    
在網(wǎng)絡(luò)安全問(wèn)題日益嚴(yán)峻的今天,登錄限流成為防范安全常用的一道屏障。登錄限流的目的是防止惡意用戶強(qiáng)制登錄,通常的做法是,當(dāng)你嘗試登錄多次而仍未成功后,系統(tǒng)就會(huì)提示你隔斷時(shí)間再登錄,或者彈出驗(yàn)證碼輸入框讓你輸入驗(yàn)證碼。登錄限流的使用增加了強(qiáng)制登錄的難度,在一定程度上增強(qiáng)了系統(tǒng)的安全。

PHP框架Laravel框架原生支持登錄限流,當(dāng)你使用其里面trait組件AuthenticatesUsers實(shí)現(xiàn)登錄時(shí),系統(tǒng)首先會(huì)調(diào)用AuthenticatesUsers的validateLogin方法驗(yàn)證你向請(qǐng)求地址傳遞的參數(shù),其目的主要是驗(yàn)證用戶名和密碼的格式。如下:


驗(yàn)證用戶名和密碼

然后,當(dāng)參數(shù)格式驗(yàn)證完畢后就會(huì)判斷當(dāng)前請(qǐng)求的請(qǐng)求次數(shù),看請(qǐng)求次數(shù)是否超過(guò)允許的最大嘗試次數(shù)。如下:

判斷請(qǐng)求的次數(shù)

判斷請(qǐng)求的次數(shù)的原理是獲取當(dāng)前登錄的用戶名和請(qǐng)求IP,通過(guò)PHP加密算法生成一個(gè)字符串,如下:

然后,將這個(gè)字符串作為鍵名去cache緩存中查找對(duì)應(yīng)鍵值(即請(qǐng)求已經(jīng)嘗試的次數(shù)),然后將鍵值與允許的最大可嘗試次數(shù)做對(duì)比,如果鍵值大于允許的最大可嘗試次數(shù),再判斷該請(qǐng)求是否受限,如果受限,則阻斷訪問(wèn),否則重置該請(qǐng)求的請(qǐng)求次數(shù),允許該請(qǐng)求提交登錄數(shù)據(jù)。如下:

在上面的代碼$this->attemptLogin($request)這一步中,系統(tǒng)會(huì)嘗試連接數(shù)據(jù)庫(kù)進(jìn)行登錄,如果登錄成功,則重置請(qǐng)求次數(shù),否則就如上面一樣,利用登錄用戶名和請(qǐng)求IP,通過(guò)PHP加密方法生成一個(gè)字符串,將此字符串作為鍵名(如$key),已嘗試的登錄次數(shù)為鍵值生成緩存。如果嘗試登錄的次數(shù)大于允許嘗試的最大次數(shù),還要利用此用戶名和登錄IP以及指定的緩存時(shí)間生成一個(gè)緩存(如$key.':timer'),作為限制登錄的標(biāo)識(shí)。

雖然,Laravel框架實(shí)現(xiàn)的登錄限流針對(duì)的是Web頁(yè)面,但其思想邏輯也可以引入Api接口服務(wù)中。

Api接口服務(wù)限流常用的算法有兩個(gè):樓桶算法和令牌桶算法。

漏桶(Leaky Bucket)算法思路很簡(jiǎn)單,水(請(qǐng)求)先進(jìn)入到漏桶里,然后漏桶以一定的速度出水(接口有響應(yīng)速率),當(dāng)水流入速度大于流出速度(訪問(wèn)頻率超過(guò)接口響應(yīng)速率),水會(huì)直接溢出,即拒絕請(qǐng)求。漏桶算法通過(guò)強(qiáng)行限制數(shù)據(jù)的傳輸速率,來(lái)達(dá)到限流目的。如下:

因?yàn)槁┩暗牧鞒鏊俾适枪潭ǖ膮?shù),所以,即使網(wǎng)絡(luò)中不存在資源沖突(沒(méi)有發(fā)生擁塞),漏桶算法也不能使流突發(fā)到端口速率。因此,漏桶算法對(duì)于存在突發(fā)特性的流量來(lái)說(shuō)缺乏效率。

令牌桶算法(Token Bucket)是一種和 Leaky Bucket 效果一樣但方向相反的算法,系統(tǒng)會(huì)按恒定1/QPS時(shí)間間隔(如果QPS=100,則間隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有個(gè)水龍頭在不斷的加水),如果桶已經(jīng)滿了就不再加了。新請(qǐng)求來(lái)臨時(shí),會(huì)各自拿走一個(gè)Token,如果沒(méi)有Token可拿了就阻塞或者拒絕服務(wù)。

令牌桶算法可以方便的改變速度,一旦需要提高速率,則按需提高放入桶中的令牌的速率。一般會(huì)定時(shí)(比如100毫秒)往桶中增加一定數(shù)量的令牌,有些變種算法則實(shí)時(shí)的計(jì)算應(yīng)該增加的令牌的數(shù)量。