RESTful API 作为现代应用程序的基础,是 Web 应用程序中最常见的接口设计,并且越来越受到开发者、企业和开放平台的广泛应用。然而,API 受到恶意攻击的风险越来越大,如 DDoS、SQL 注入、XSS 等,这些攻击会极大地影响系统的稳定性和安全性。因此,限流与防刷方案成为了 RESTful API 系统设计中重要的一环。
什么是请求限流?
请求限流是一种通过限制用户请求速率、访问频次等方式来保护服务资源和维护系统安全的一种方式。它的核心思想是控制每个用户的请求访问频次并对访问流量进行监控和调整,以确保服务的可用性和安全性。
在 RESTful API 中,常常使用 Token Bucket Algorithm 和 Leaky Bucket Algorithm 这两种算法来进行请求限流操作。其中 Token Bucket Algorithm 基于令牌桶的思想,计算每个用户(或应用程序)允许在一定时间窗口内的请求次数,如果超过则响应错误码;Leaky Bucket Algorithm 模拟一个漏桶,不允许在单位时间内超过最大请求量的限制。
什么是防刷?
防刷是指基于认证、匹配、封禁等方式进行防御,避免利用自动化程序对 API 接口进行恶意访问和利用服务资源的行为。RESTful API 中,防刷可以分为验证码、身份认证、行为分析等多个方面来进行优化。
在 RESTful API 中,最基本的防刷方法是采用验证码,验证码在服务器端生成一张验证码图片,客户端需在请求中发送验证码并与服务器端产生的验证码进行匹配。如果匹配成功,则表明是一个正常的用户发起的请求;如果匹配失败,则表明该请求由机器人发起,应被禁止。可以结合 Token Bucket Algorithm 进行验证码限制,使访问者需要在一定时间窗口内完成对服务器端资源的访问,防止机器人大规模进行请求,并且采取滑动窗口方式进行实时累积。
如何实现请求限流和防刷?
下面以 Node.js 平台为例说明如何通过 Express 框架实现请求限流和防刷。
使用 Token Bucket Algorithm 进行请求限流
首先,我们需要安装两个 Node.js 模块 limiter 和 redis。limiter 是用来实现请求限流的工具库,redis 是具有高效的 k-v 存储能力的缓存服务。
npm install limiter redis
接下来,我们可以通过如下代码实现一分钟内最多十次请求的限制:
-- -------------------- ---- ------- ----- ----- - ----------------- ----- ------- - ------------------------------- ----- ------- - ------------------- ----- --- - ---------- ----- ------- - --- --------- ------------------ --- --------- --------- --- --- -------------------- --- ---------------- ------------- ---- ----- - ----------------------- ------------- ------------------ - -- ------------------ - -- - ------------------------- ---- ------------ - ---- - ------- - --- -- ------------- ---- ----- - ---------------- ------- --- ---------------- ---------- - ------------------- --------- -- ---- ------- ---
其中,tokensPerInterval 代表着每学时间间隔内可以发起的 API 请求量,interval 代表时间间隔的单位,db 定义了 Limiter 实例数据记录在 Redis 缓存中。
使用验证码实现防刷
我们首先需要引入 svg-captcha 包,该包用于生成验证码图片:
npm install svg-captcha
在路由中,客户端需要先进行验证码请求:
<img src="/captcha.png" alt="验证码"> <input type="text" name="captcha">
在服务器端,需要对验证码进行生成并添加到请求头中:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ----- ---------- - ----------------------- ----------------------- ------------- ---- - --- ------- - -------------------- ------------------- - --------------------------- ----------------------------- ----------------- ----------------------- --- ---------------- ------------- ---- ----- - ----- ------- - ------------------ -- --------- -- --------------------- --- -------------------- - ----------------------------- ---------- - ---- - ------- - -- ------------- ---- ----- - ---------------- ------- --- ---------------- ---------- - ------------------- --------- -- ---- ------- ---
其中,svg-captcha
包生成的验证码是随机的,将其存入 session 变量中供后续的 API 调用使用,当用户发起 API 访问时,需要将验证码一起带入请求参数中,并对验证码进行验证。
总结
请求限流和防刷在 RESTful API 中的设计与实现具有重要作用,可保证服务的安全性和资源的可用性。本文介绍了 Token Bucket Algorithm 和 Leaky Bucket Algorithm 两种算法的原理和使用,以及防刷的验证码实现方案,并由 Node.js 平台和 Express 框架进行了示例展示,希望对读者有所启发和帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6493e50748841e989417840f