如何在 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)
- 下载并安装
cloudflared.deb
使用 sudo dpkg -i cloudflared-ver_xxx.deb
- 按照 Cloudflare Docs 提供的配置和创建 Argo 隧道。
- 使用 Argo 隧道访问您的应用程序的域或子域。
例子
在我的例子中,如果我在本地 运行 有一个 localhost:1909
的应用程序。
并在我的 config.yaml
中使用正确的转发(请参考 Cloudflare 文档进行配置),我可以在 myapp.example.com
或 www.example.com
上访问它
优势
- 自动 HTTPS 证书和重定向。
- 更快、更好、更易于配置。
- SEO 现在需要 HTTPS 证书以获得更好的评级(您可以得出)。
我想做一个防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)
- 下载并安装
cloudflared.deb
使用sudo dpkg -i cloudflared-ver_xxx.deb
- 按照 Cloudflare Docs 提供的配置和创建 Argo 隧道。
- 使用 Argo 隧道访问您的应用程序的域或子域。
例子
在我的例子中,如果我在本地 运行 有一个 localhost:1909
的应用程序。
并在我的 config.yaml
中使用正确的转发(请参考 Cloudflare 文档进行配置),我可以在 myapp.example.com
或 www.example.com
优势
- 自动 HTTPS 证书和重定向。
- 更快、更好、更易于配置。
- SEO 现在需要 HTTPS 证书以获得更好的评级(您可以得出)。