亚洲色蝴蝶中文娱乐网,在线亚洲欧美一区二区中文字幕,无人视频在线观看视频高清视频,99午夜国产精品一区二区,人人妻人人爽人人狠狠

從Web登錄限流看Api限流

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

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


驗證用戶名和密碼

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

判斷請求的次數(shù)

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

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

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

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

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

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

因為漏桶的流出速率是固定的參數(shù),所以,即使網(wǎng)絡(luò)中不存在資源沖突(沒有發(fā)生擁塞),漏桶算法也不能使流突發(fā)到端口速率。因此,漏桶算法對于存在突發(fā)特性的流量來說缺乏效率。

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

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