【问题标题】:Securely rate limit an API, prevent IP address spoofing安全地限制 API 的速率,防止 IP 地址欺骗
【发布时间】:2015-01-22 19:30:24
【问题描述】:

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

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

我的想法:

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

感谢您的帮助和建议。

【问题讨论】:

  • 如果您的应用程序使用 TCP,那么您不必担心
  • “IP 欺骗”与您所说的完全不同。用户在 IP 之间跳转是不是欺骗。这就是网络 CAN 的工作方式,具体取决于用户的提供商。例如考虑一个在建筑物中使用 WiFi 的手机用户,然后在他们外出时迁移到手机数据。两个不同的网络,两个不同的 IP,但不是“欺骗”。
  • 同一个代理后面有很多用户怎么办?
  • @Marc 我更担心的是成千上万次的故意和恶意欺骗,而不是某人的 IP 地址在使用应用程序期间更改一两次。
  • @myte 好点,我们也需要为我们的应用程序考虑这一点。

标签: php api security ip-address cloudflare


【解决方案1】:

通常您会使用一个秘密令牌(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

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

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

【讨论】:

  • 那么你的意思是不可能欺骗使用 TCP 连接的服务器认为它正在接收来自不真实 IP 的请求?
  • (我们谈论的是 HTTP 请求)除非攻击者控制了 spoofed IP(或网络)本身:否。 (如果我错了,请纠正我)
  • 好吧,我相信我只是对 TCP 连接的工作方式有误解。谢谢。
【解决方案2】:

SSL 会阻止这种形式的 IP 欺骗吗?

仅当欺骗者无法轻松解密消息时,它才能防止中间人 (MitM) 攻击。

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

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

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

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

我希望这会有所帮助。

【讨论】:

  • ssl 可以帮助解决中间人攻击,但无法阻止它们。例如考虑一个州级攻击者,他可以从注册商处获取签名的 SSL 证书。它以前发生过,防止的唯一方法是对您所提供的 SSL 证书进行可靠的第 3 方验证,您认为您正在连接的提供商实际使用的是什么。 SSL本质上是用于验证的卫生纸。让你感觉全身发亮和刺痛,但仍然有一层便便涂层。
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 2013-04-22
  • 2014-07-17
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2020-09-02
  • 2011-04-10
相关资源
最近更新 更多