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

Securely rate limit an API, prevent IP address spoofing

我正在使用 PHP、MySQL 和 Redis 开发 API,并希望对特定呼叫进行速率限制。 API 坐在 CloudFlare 后面。为实现这一点,我将增加每个 IP 地址每小时对 Redis 中的特定调用的计数,如果超过限制,将显示错误。

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

我的想法:

感谢您的帮助和建议。

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

由于您试图通过 IP 限制请求,我假设您将要创建一个 "open" API 任何人都可以发送请求,无需身份验证。

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

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

你看IP 欺骗 不是问题。但是您需要明白,通过 IP 进行速率限制根本不是一个好的解决方案。那是因为:

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

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


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

Does SSL prevent this form of IP spoofing?

没有

Is there a way to make sure the client receives the server's response, thereby ensuring that it's not a spoofed IP address?

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

Does cloudflare somehow verify the IP address is not spoofed when passing along the HTTP_CF_CONNECTING_IP header?

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

Does SSL prevent this form of IP spoofing?

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

Is there a way to make sure the client receives the server's response, thereby ensuring that it's not a spoofed IP address?

防御机制 首先,确保您的防火墙和路由器配置正确,并限制来自互联网的伪造流量。 - See more at:

Does cloudflare somehow verify the IP address is not spoofed when passing along the HTTP_CF_CONNECTING_IP header?

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

希望对您有所帮助。