2013-03-17 135 views
1

我正在研究如何進行速率限制,並且似乎很多API(包括StackOverflow v1 API)限制IP或限制API鍵在某個域上使用。這是如何可靠地完成的?通過IP的API速率限制

當我查看由XHR生成的對我的API的請求時,它有一個引用(通常)和一個遠程地址。我認爲遠程地址是有希望的,但看起來這是使用網站的用戶的地址,而不是發出請求的網站的地址。引用者看起來並不總是被髮送,但我想當它在那裏時,可以查找與服務器對應的IP。

我的觀點是:這一定是可能的,因爲一些大牌會這麼做;他們是如何做到的呢?

+0

不是100%確定你的意思。他們將查看作爲請求源的遠程IP地址。你的意思是「提出請求的網站」? – Anorov 2013-03-17 03:38:47

+0

因此,如果XHR從網頁上提出請求,他們會通過網頁進行費率限制,而不是訪問該網站的人,對吧? – NickAldwin 2013-03-17 03:40:57

+0

他們想基於應用程序對API密鑰進行速率限制/傳遞,而不是基於應用程序的用戶,對吧? – NickAldwin 2013-03-17 03:42:25

回答

2

在舞弊舞臺上,這些被稱爲速度控制,在交通管理中它類似於「流量整形」。基本上你每個時間段允許有限的使用,例如,你可能只允許10個請求/分鐘/ IP地址。

對於每個'請求',確定遠程地址(C中的getpeername()),這個函數將永遠是遠程用戶的ip地址。然後簡單地按每個時間段計算處理請求的方式,如果超出限制,請執行任何操作。在僞代碼

Get block for remote ip 
If time-now is new window, then reset usage to zero 
Add one to usage count 
If usage > allowance then ..... 
Else if usage > allowance*0.75 then slow-down 
Else ok 

雖然我已經展示了一個時期,大多數的實現通常在幾個時期的平均水平,例如每分鐘一小時等等,他們也傾向於允許突發和只能限制持續的負荷,但這取決於您希望允許的配置文件。

如果這是針對API的,那麼只是減慢請求速度而不是提供硬錯誤是正常的。不保證另一端的客戶端會處理錯誤。如果是用戶屏幕,則可以顯示超出的限制。

您當然可以通過您希望的任何維度,ip地址,引用,瀏覽器類型!,pageurl,cookie來限制。如果您使用的是getpeername,請注意,如果幾個併發用戶位於公共專用路由器的後面,則它們都可以具有相同的遠程IP地址。

0

您可以使用請求的遠程地址或x-forwarded-for標頭中的第一個ip。

僅當您的應用位於您信任的逆向代理或您在PaaS上運行的逆向代理後面時才使用標頭。你需要控制你信任的級別。檢查nginx模塊的真實IP。

使用IP地址是匿名流量的一種非常常見的模式,因爲此時您對用戶一無所知。一旦用戶通過身份驗證(作爲個人或應用),最好使用其id而不是ip。