使用java限制单个网页的速率

问题描述 投票:0回答:1

我有一个面向公众的网站,我需要通过限制客户端发送创建新用户请求的次数来限制特定页面(新用户注册页面)的速率。此页面允许新用户在网站上注册。但恶意用户很有可能在很短的时间内发送数百个请求并创建不同的用户 ID。有没有办法识别此类请求并阻止他们在短时间内发送多个请求。 到目前为止我尝试过的其他选项:

  1. 通过读取 x-forwarder-for http 请求标头来识别用户的 IP,并从中获取最左边的 IP 地址。然而,在阅读后,该地址可能不是 100% 正确,我们最终可能会阻止从代理/防火墙后面访问该网页的新用户,因为他们都可能具有相同的 IP 地址。

  2. 可以转发请求标头 x,以给出位于防火墙后面的用户的正确 IP 地址。这个靠谱吗?

  3. 我的应用程序使用Java/JSF框架。

  4. 如果请求来自同一客户端/IP,我想对特定页面的访问进行速率限制。就我而言,用户尚未登录。如果用户已登录,则很容易在服务器端阻止该用户的请求。

  5. 我在我的网站中使用了验证码。点击几下后,就会弹出捕获页面。

我还尝试使用独立的java程序访问该页面并向同一页面提交多个请求并创建多个用户ID。理想情况下,这应该被阻止。

任何特定工具或最佳实践。请指教。

谢谢。

java rate-limiting
1个回答
0
投票

有两个方面,首先是java整体的速率限制。

您可以轻松地结合 Guava 速率限制器(请参阅https://guava.dev/releases/19.0/api/docs/index.html?com/google/common/util/concurrent/RateLimiter.html)与番石榴缓存结合(参见https://github.com/google/guava/wiki/CachesExplained)。

您只需为每个 IP 创建速率限制(对于上述

x-forwarder-for
),然后应用速率限制逻辑。

确实,速率限制将应用于子网内的所有用户,但任何其他开箱即用的速率限制服务无论如何都是如何工作的。

例如,如果您发现自己正在从位于达拉斯的 Google 数据中心受到 ddos 攻击,您可以填写滥用表格,Google 将进行调查。

请注意,DDOS 附加并不一定意味着超高的请求率。如果用户创建(例如)需要 1 秒,那么在您的情况下每秒 10 个请求可能会导致拒绝服务。

现在,大多数时候您不想自己进行速率限制。在这种情况下,Cloudfare(或其他类似服务)会为您提供该服务。以 https://www.cloudflare.com/en-gb/learning/bots/what-is-rate-limiting/ 为例。这源于您提出的问题(java中的速率限制)但是

最好的代码就是根本没有代码

永远不会变老;-)

© www.soinside.com 2019 - 2024. All rights reserved.