【问题标题】:Bypassing DRF throttling绕过 DRF 节流
【发布时间】:2023-02-07 06:32:05
【问题描述】:

我有一个在 Nginx + Gunicorn 服务器上运行的 Django 应用程序,我在其中使用 DRF 节流。每当我向我的服务器发出 API 请求并更改客户端中的 X-Forwarded-For 标头值时,我就能够绕过对未经身份验证的用户的限制,从而可以无限制地访问 API。这当然是不希望的。

我认为解决这个问题的一种方法是让 Nginx 在 X-Forwarded-For 请求标头的末尾附加真实 IP,然后再使用代理参数到达服务器。当我检查 Postman / RapidApi 客户端时,它似乎并没有改变标题。我认为这就是导致错误的原因,但最终我不知道。

Nginx 配置文件:

location / {
    include proxy_params;
    proxy_pass http://unix:/run/gunicorn.sock;
}

Nginx 的 proxy_params 文件包括设置 X-Forwarded-For 请求标头,如下所示:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

有人可以告诉我我做错了什么以及如何解决它,这样您就不能发出无限制的 API 请求了吗?如果您需要更多信息或说明,请告诉我。

【问题讨论】:

    标签: django nginx django-rest-framework


    【解决方案1】:

    DRF 节流不是减轻 DDOS 攻击的可靠解决方案。有一些已知的漏洞可以在野外绕过 DRF 节流:

    1. security vulnerability: bypass throttling
    2. Bypass Throttling based on source ip address
    3. Implementing Django-rest API Throttling and Unauthenticated bypass

      强烈建议使用其他第 3 方解决方案来缓解 DDOS 和暴力破解。

      您可以自定义 DRF 节流来修补上述漏洞。但请记住,这不是安全的解决方案!

      DRF 节流使用 X-Forwarded-For HTTP 标头生成密钥以限制访问。如official docs所述,自定义是通过继承throttling.BaseThrottle实现的:

      class RandomRateThrottle(throttling.BaseThrottle):
          def allow_request(self, request, view) -> bool:
              # Your custom logic here...
      

      请求头在allow_request()中可用,您可以使用其他字段(如User-Agent)来检查请求发起者的唯一性。您还可以添加一点随机性。

      检查 here 以获取 HTTP 标头字段列表。

      注意:allow_request() 应该返回一个布尔值。

      注意:检查其他字段仅修补您提到的漏洞,它比默认值更好。

    【讨论】:

      【解决方案2】:

      通过在 DRF 配置中设置 NUM_PROXIES 设置,我能够正确检索客户端的 IP 地址。此设置确定 DRF 应信任 XFF 标头中的代理服务器数量,因此能够选择正确的 IP 地址。 因为我只有一个代理服务器,所以我将 NUM_PROXIES 设置为 1:

      REST_FRAMEWORK = {
          …
          'NUM_PROXIES': 1
      }
      

      除此之外,我还更改了 Gunicorn 日志格式,以便能够在访问日志中观察到 XFF 标头。然后我意识到 nginx 实际上确实正确地将 IP 附加到 XFF 标头。

      【讨论】:

        猜你喜欢
        • 2017-02-24
        • 2018-09-28
        • 1970-01-01
        • 2016-04-22
        • 2017-01-11
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多