API速率限制

时间:2013-03-17 03:36:35

标签: api http http-headers rate-limiting

我正在研究如何进行速率限制,并且似乎许多API(包括StackOverflow v1 API)通过IP限制速率或限制API密钥以在特定域上使用。这怎么可靠地完成?

当我查看XHR为我的API生成的请求时,它有一个引用者(通常)和一个远程地址。我认为远程地址很有希望,但看起来这是使用网站的用户的地址,而不是发出请求的网站的地址。引用者看起来并不总是被发送,但我想当它在那里时,可以查找与服务器对应的IP。

我的观点是:它必须是可能的,因为一些大牌明星会这样做;他们是怎么做到的?

2 个答案:

答案 0 :(得分: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的,那么简单地减慢请求而不是提供硬错误是正常的。无法保证thr端的客户端将处理错误。如果是用户屏幕,则可以显示超出限制。

您当然可以限制您希望的任何维度,IP地址,引用,浏览器类型!,pageurl,cookie。如果您使用的是getpeername,请注意,如果多个并发用户位于公共专用路由器后面,则他们都可以拥有相同的远程IP地址。

答案 1 :(得分:0)

您可以使用请求的远程地址或x-forwarded-for标头中的第一个ip。

仅当您的应用位于您信任的反向代理或您在PaaS上运行时才使用标头。您需要控制您信任的级别。检查nginx模块real-ip。

使用ip地址是匿名流量的一种非常常见的模式,因为此时您对用户一无所知。一旦用户通过身份验证(作为个人或应用程序),最好使用其id而不是ip。