IP限制API速率

IP限制API速率,api,http,http-headers,rate-limiting,Api,Http,Http Headers,Rate Limiting,我正在研究速率限制是如何实现的,似乎很多API(包括StackOverflow v1 API)都会通过IP限制速率或限制API密钥在特定域上的使用。如何可靠地做到这一点 当我查看XHR对API生成的请求时,它有一个引用(通常)和一个远程地址。我认为远程地址很有希望,但它看起来是使用该网站的用户的地址,而不是发出请求的网站的地址。推荐人看起来并不总是发送的,尽管我想当它在那里时,可以查找与服务器对应的IP 我的观点是:这一定是可能的,因为一些大牌人物这样做了;它们是如何做到的?在欺诈领域,这些被称

我正在研究速率限制是如何实现的,似乎很多API(包括StackOverflow v1 API)都会通过IP限制速率或限制API密钥在特定域上的使用。如何可靠地做到这一点

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


我的观点是:这一定是可能的,因为一些大牌人物这样做了;它们是如何做到的?

在欺诈领域,这些被称为速度控制,在流量管理中,它类似于“流量整形”。基本上,您允许每个时间段的有限使用,例如,您可能只允许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地址、引用、浏览器类型!,页面URL,cookie。如果您使用的是getpeername,请注意,如果几个并发用户位于公共专用路由器后面,则它们都可以具有相同的远程ip地址。

您可以使用请求的远程地址,也可以使用x-forwarded-for报头中的第一个ip

仅当您的应用程序位于您信任的反向代理之后或您在PaaS上运行时,才使用标题。您需要控制您信任的级别。检查nginx模块的真实ip


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

不是100%确定您的意思。他们将查看作为请求源的远程IP地址。你说的“提出请求的网站”是什么意思?因此,如果一个请求是由XHR从一个网页提出的,他们会根据网页而不是访问该网站的人来评分限制,对吗?他们希望根据应用程序而不是应用程序的用户来评分限制/分发API密钥,对吗?大多数大牌公司都有API密钥和API机密(如果他们需要认证的话)访问api方法。如果您同意这种方法,您可以限制每个api键的使用,可能吗?