安全地限制 API 的速率,防止 IP 地址欺骗


Securely rate limit an API, prevent IP address spoofing

我正在使用PHP,MySQL和Redis开发一个API,并希望限制特定调用的速率。API位于CloudFlare后面。为了实现这一点,我将递增每个 IP 地址在 Redis 中为特定调用进行的每小时计数,如果超出限制,则会显示错误。

但是,我相信我遇到了 IP 地址欺骗的问题。我知道如果真实客户端欺骗他们的 IP 地址,他们永远不会收到回复,但这对于创建帐户调用等调用可能不是必需的。客户端可以通过注册许多帐户(所有帐户具有不同的 IP)来有效地创建 DoS 攻击,同时避免速率限制。这将导致我的系统发送大量欢迎电子邮件(导致我的服务器被标记为垃圾邮件),并且如果用户的电子邮件帐户被恶意注册,则可能会阻止用户注册。如何避免这种情况?

我的想法:

  • SSL 可以防止这种形式的 IP 欺骗吗?
  • 有没有办法确保客户端收到服务器的响应,从而确保它不是欺骗的 IP 地址?
  • Cloudflare 是否以某种方式验证 IP 地址在传递 HTTP_CF_CONNECTING_IP 标头时没有被欺骗?

感谢您的帮助和建议。

通常,

您会使用秘密令牌(API 密钥、登录凭据或其他任何)来标识用户并计算每个用户帐户的请求数。

由于您正在尝试通过IP限制请求,因此我假设您将创建一个"开放"API,任何人都可以在其中发送请求,而无需身份验证。

在这种情况下,术语 *IP 欺骗不是问题。这是因为 - 除非他控制您的服务器和互联网之间的路由 - 欺骗攻击者不会得到答案(如您所说)。但是HTTP(S)是通过TCP传输的,建立TCP连接需要攻击者执行成功的握手,这需要从服务器接收连接ID - 这意味着它需要接收答案。

TCP协议的维基百科页面可能是一个很好的外部资源:https://en.wikipedia.org/wiki/Transmission_Control_Protocol

您会看到 IP 欺骗不是问题。但是您需要了解,IP的速率限制根本不是一个好的解决方案。这是因为:

  • 滥用者可以在达到限制后请求新的IP
  • 您的 API 可能由内部 IP 获取的大型组织使用由核心路由器 NAT 后,您只能看到该核心路由器 IP。

我强烈建议您使用身份验证(与SSL一起! 并限制每个用户群的请求。


简要回答列出的问题(如果需要,可以解释更多)

SSL 可以防止这种形式的 IP 欺骗吗?

有没有办法确保客户端收到服务器的响应,从而确保它不是欺骗的 IP 地址?

是的,它是在TCP中实现的 ->请参阅上面的维基百科链接中的ACK

Cloudflare 是否以某种方式验证 IP 地址在传递 HTTP_CF_CONNECTING_IP 标头时没有被欺骗?

如上所述。HTTP 流量需要已建立的 TCP 连接。因此,这是没有意义的。

SSL 可以防止这种形式的 IP 欺骗吗?

它防止中间人 (MitM) 攻击,因为欺骗者无法轻松解密消息。

有没有办法确保客户端收到服务器的响应, 从而确保它不是欺骗性的 IP 地址?

防御机制首先,确保您的防火墙和路由器配置正确,并限制来自互联网的伪造流量的前进。- 查看更多信息:

Cloudflare 是否以某种方式验证 IP 地址在以下情况下没有被欺骗 传递HTTP_CF_CONNECTING_IP标头?

除非您有上述文章中提到的使用 ACL 的特殊设备,否则您无法真正验证 IP 地址。

我希望这有所帮助。