dot 快速的未来即将来到你所在城市的活动中。

加入我们参加 Redis 发布活动

限速

返回术语表

限速定义

限速是一种计算机系统中用于控制发送或处理请求的速度的技术,以保持系统稳定性和安全性。在 Web 应用中,限速限制了客户端在给定时间段内向服务器发出的请求数量,以防止滥用并确保多个客户端公平使用资源。

随着我们对 Web 应用程序和服务依赖性的日益增长,网络攻击的风险也在随之增加。根据 RiskIQ 的报告,2020 年网络攻击数量超过 20 亿次。速率限制是防御此类攻击的有效工具。它可以通过限制在给定时间范围内访问网站或应用程序的流量,有助于预防超负荷。该技术能阻止网络威胁并保持系统的稳定性。

总体而言,速率限制是一种重要的机制,它有助于确保计算机系统的安全性和可靠性,并且被广泛用于各种应用程序中,包括 Web API、Web 服务器和网络基础设施。

为什么应用程序和系统需要速率限制?

速率限制是任何实用应用程序和系统管理安全策略的必要组成部分。通过限制可以向应用程序或系统发出的请求或连接数,它有助于防止各种恶意活动,例如 DDoS 攻击、暴力破解、凭证填充、库存囤积攻击和数据抓取。

实施速率限制可以帮助组织确保所有用户都能获得资源,并防止恶意活动压垮系统。通过限制请求数量,公司可以针对各种类型的攻击做好防御,例如

DDoS 攻击:通过将请求数量限制在合理水平,组织可以防止 DDoS 攻击使系统过载并使其瘫痪。

凭证填充:限制来自单个 IP 地址或用户的登录尝试可以防止凭证填充攻击,在该攻击中,攻击者使用自动脚本尝试不同的用户名和密码组合,直到找到匹配为止。

暴力破解:限制对资源的请求或访问尝试次数可以帮助防止暴力破解,在该攻击中,攻击者尝试不同的字符组合来获取对系统或应用程序的访问权限。

数据抓取:通过限制单个用户或 IP 地址发出的请求数,速率限制可以帮助防止数据抓取。可以防止攻击者抓取敏感数据。

库存囤积攻击:限制对特定商品或资源的请求数可以阻止库存囤积攻击,在该攻击中,攻击者尝试购买受欢迎商品的所有可用库存,以更高的价格转卖。

总体而言,速率限制是应用程序和系统确保资源的安全性和可靠性,同时防御恶意活动所必需的工具。通过实施速率限制,公司可以改善自身的安全态势并防止攻击,确保资源对所有用户可用。

速率限制类型

基于 IP

速率限制的一种常见类型基于 IP,它根据请求的源 IP 地址来限制访问。此方法有助于防止来自少量 IP 地址的攻击,但对分布式攻击可能效果不佳。

基于用户

基于用户的速率限制是另一种方法,该方法根据发出请求的用户账户来限制访问。此方法有助于防止凭据填充攻击,但它要求在不同会话中识别唯一用户,这可能极具挑战性。

基于应用程序

基于应用程序的速率限制根据发出请求的应用程序类型来限制访问。此方法有助于防止囤积库存和数据抓取攻击,但它对来自合法应用程序的攻击可能无效。

令牌桶

令牌桶速率限制是一种流行的方法,它使用令牌桶来调节请求流。每个请求都消耗掉桶中的一个令牌,一旦桶中没有令牌,就不再允许更多请求,直到桶中重新装满为止。

组织应定期审查和更新其速率限制策略,以确保它们对新出现和不断产生的威胁仍然有效。此外,必须选择最符合你组织的具体需求和要求的速率限制方法。

速率限制如何工作?

速率限制有点像夜总会的保安。保安评估进入俱乐部的人流情况,如果人太多且不安全,则会停止入场。同样,速率限制控制向应用程序发出的请求数量,以防止应用程序不堪重负或崩溃。就像保安可能会将每小时的入场人数限制在一定范围内一样,速率限制会将请求限制在每秒或每分钟一定范围内。通过仔细管理人员或请求流,保安和速率限制都会为所有人帮助维持一个安全可靠的环境。

速率限制通常基于对 IP 地址的跟踪,并度量每次请求之间的时间。当用户发出请求时,系统会对其进行跟踪,并将发出的请求数量与预定义的阈值进行比较。如果请求数量超过阈值,则速率限制会开始起作用且系统在一定时间内不会满足用户的请求。

用于速率限制的算法

速率限制算法是让组织能够控制和限制进入应用程序和系统请求速率的重要工具。可以根据应用程序或系统的特定需求使用不同的算法。

固定窗口速率限制:这是一个简单的算法,它会统计在一个固定时间窗口内(例如一分钟)接收到的请求数量。一旦达到最大请求数量,会在下一个窗口开始之前拒绝其他请求。此算法实现方便,并能有效防御 DDoS 攻击,但它可能限制合法用户。

滑动窗口速率限制:此算法使用随着时间推移而移动的滑动窗口跟踪最近一段时间内接收到的请求数量。此算法比固定窗口速率限制更灵活,并且可以根据流量峰值进行调整,使其成为使用模式不同的应用程序的更佳选择。但是,它可能无法有效防御持续的攻击。

令牌桶速率限制:这会维护一个令牌桶,以固定速率填充。每个请求消耗一个令牌,一旦桶为空,则拒绝其他请求。令牌桶速率限制适用于处理突发流量,因为它可以允许同时处理一定数量的请求。但是,它可能无法有效防御持续的流量。

漏桶速率限制:这与令牌桶速率限制类似,但会将请求放入一个会逐渐清空的“桶”中,随着时间的推移允许处理更多请求。此算法可以有效处理突发流量并且有助于防止过载,但它可能无法有效防御持续的攻击。

选择正确的速率限制算法取决于多个因素,包括应用程序的流量模式以及对恶意活动的预期保护级别。组织必须在保护其系统和提供良好用户体验之间取得平衡。定期审查和更新速率限制策略也至关重要,以确保它们对新出现的威胁依然有效。

速率限制用例

许多流行的网站和应用程序使用速率限制来防止恶意攻击、提高性能并确保所有用户公平使用。以下是速率限制的一些实际用例

  1. 谷歌地图 API – 谷歌地图 API 是开发人员用于将地图和基于位置的服务集成到其应用程序中的流行工具。但是,由于其流行性,API 经常成为恶意流量的目标,这会使服务过载并影响合法用户。谷歌地图 API 使用 速率限制 来抵御这些攻击,并确保所有用户都可以访问服务。
  2. GitHub API – GitHub 是一个代码托管平台,全世界有 hàng triệu 人的开发人员使用。GitHub API 提供对许多平台功能的编程访问,例如创建和管理存储库。过度的 API 使用会导致平台出现性能问题并影响其他用户。 GitHub 使用速率限制 来防止这些问题并确保所有用户都可以公平地访问 API。
  3. Twitter API – Twitter API 允许开发人员使用 Twitter 平台构建应用程序,例如发布推文或检索用户数据。滥用或发送垃圾邮件的 API 使用方式会损害该平台和其他用户。Twitter 使用速率限制来防止这些问题,并确保所有用户均能不间断地使用 API。
  4. Cloudflare – Cloudflare 是一种流行的内容传送网络和安全服务,许多网站和应用程序都在使用。Cloudflare 使用速率限制来防止 DDoS 攻击和其他恶意流量使网站和应用程序不堪重负,确保其可用性和安全性。

在所有这些示例中,速率限制帮助这些网站和应用程序自身免遭攻击,并确保其服务仍对合法用户有效。

Redis 速率限制最佳实践

使用 Redis 构建速率控制器非常简单,因为有两个命令 INCR 和 EXPIRE。基本概念是希望在给定时间段内将请求限制在特定服务上。假设我们有一项服务,其中用户通过 API 密钥标识。此服务声明其在任何给定分钟内限制为 20 个请求。

为实现此目的,我们希望为每个 API 密钥创建 Redis 密钥。为确保我们不会用垃圾信息填满整个数据库,还需要在一分钟后使该密钥过期。将其设想为如下内容

用户 API 密钥 = zA21X31,绿色表示无限制,红色表示限制。

Redis 密钥zA21X31:0zA21X31:1zA21X31:2zA21X31:3zA21X31:4
3820>220
过期时间最新 12:02最新 12:03最新 12:04最新 12:05最新 12:06
时间12:0012:0112:0212:0312:04

密钥由用户 API 密钥和分钟数派生得到,并用冒号连接。由于我们始终使密钥过期,因此我们只需要跟踪分钟数——当小时数从 59 滚动到 00 时,我们可以确定不存在另一个 59(它会在 58 分钟之前过期)。

使用伪代码,我们来看看这是如何工作的。

1>GET [user-api-key]:[current minute number]
2如果第 1 行的结果小于 20(或未设置),转到 4,否则进入第 3 行
3显示错误信息并结束连接。退出。
4>MULTIOK > INCR [user-api-key]:[current minute number] QUEUED > EXPIRE [user-api-key]:[current minute number] 59 QUEUED >EXECOK
5执行服务任务

理解该例程的两个关键要点

  1. 对不存在的键执行 INCR 将始终为 1。因此,第一分钟的调用将返回 1 的值
  2. EXPIRE 与INCR 位于一个 MULTI 事务中,这意味着形成一个原子操作。

最坏的情况是,由于一些非常奇怪且不可能的原因,Redis 服务器在 INCR 和 EXPIRE 之间发生故障。当通过 AOF 或内存中复制还原数据时,INCR 将不会被还原,因为事务不会完成。

使用此模式,任何一个用户可能将拥有两个限制键,一个当前正在使用,另一个将在同一分钟时间段过期,但这种模式非常高效。