如何在 Web 服务器(Flask)上限制每分钟的请求数

How can I limit requests per minute on a web server (Flask)

我想做一个防ddos。我想这样做,如果一分钟内发出超过 45 个请求,请求的 ip 将被列入 ip 黑名单 30 分钟。

我怎样才能用烧瓶做到这一点,没有数据库

如果您想要 DDOS 保护,请使用 Cloudflare 之类的服务。速率限制无助于阻止 DDOS。

基于 IP 的速率限制:

当然,这实际上并不难:只需为使用您的服务的每个 IP 地址创建一个带有条目(键)的字典;在该字典中,每个值都是(最多)访问该 IP 地址的最后 45 次的列表。当列表实际达到 45 的长度时,您检查最后一个条目是否实际上是在最后一个小时内 - 如果是,您只是阻止(无论那意味着什么)。

您需要定期从第一个列表条目早于一个小时的键中清除该字典,否则它会占用您的 RAM。

顺便问一下,您知道什么软件可以检查 table 并且可以回答“该密钥的最后一个条目是什么吗?”之类的问题?
那是一个数据库。你的问题是需要一个类似数据库的东西。

我不建议只限制速率,如果攻击者使用代理并且可以为每个代理设置每秒请求数,它对你没有帮助。我建议将 Cloudflare 与挑战一起使用(js 挑战),您还可以将那里的请求限制为每 10000 个合法请求 0.05 美元。

解决方案

速率限制的最基本答案和解决方案是使用以下方法 Flask 库 https://flask-limiter.readthedocs.io/en/stable/ 称为 flask-limiter 。它可以继续并在应用程序级别为我们提供适当的速率限制功能。但请注意,使用它来防止 DDoS 攻击甚至一些简单的 DOS(拒绝服务)攻击不会通过攻击者端的一个很好的代理列表来缓解。

正确的解决方案和更简单的方法(使用 Cloudflared)

  1. 下载并安装 cloudflared.deb 使用 sudo dpkg -i cloudflared-ver_xxx.deb
  2. 按照 Cloudflare Docs 提供的配置和创建 Argo 隧道。
  3. 使用 Argo 隧道访问您的应用程序的域或子域。

例子

在我的例子中,如果我在本地 运行 有一个 localhost:1909 的应用程序。 并在我的 config.yaml 中使用正确的转发(请参考 Cloudflare 文档进行配置),我可以在 myapp.example.comwww.example.com

上访问它

优势

  1. 自动 HTTPS 证书和重定向。
  2. 更快、更好、更易于配置。
  3. SEO 现在需要 HTTPS 证书以获得更好的评级(您可以得出)。