如何防止接口被刷

目录

🛡️ 一、常见的防刷策略分类

🔧 二、技术实现细节

✅ 1. 基于 IP 限流

✅ 2. 给接口加验证码

✅ 3. 使用 Token 限制接口访问权限

✅ 4. 给接口加冷却时间(验证码类经典)

✅ 5. 使用滑动窗口限流算法(更精细)

✅ 6. 使用 API 网关限流工具

✅ 7. 行为分析 + 机器学习防刷(高级)

🔒 三、防刷策略组合应用(实战示例)

验证码接口:/send-code

🧪 四、测试建议

🧠 限流目标设定

📦 所需依赖

🧪 测试方式

✅ 优势


防止接口被刷(即防止恶意频繁访问接口)是构建稳定、安全的后端服务的关键环节。接口被刷会带来以下问题:

  • 服务压力大 → 崩溃或变慢;

  • 资源被滥用 → 例如验证码短信费用增加;

  • 用户体验差 → 正常用户无法访问服务;

  • 安全隐患 → 存在撞库攻击、恶意爬虫等风险。


🛡️ 一、常见的防刷策略分类

类别技术措施举例说明
身份识别类登录校验、API Key、Token、Cookie 等用户必须登录才能访问某些接口
频率限制类限流、滑动窗口、漏桶/令牌桶算法每个 IP 每分钟最多访问5次
行为识别类图形验证码、人机验证、行为轨迹分析连续请求验证码时需要输入图形码
请求来源控制Referer、User-Agent、IP 黑名单拒绝来自非正常来源的请求
设备绑定每个手机号/账号最多绑定几个设备防止批量注册账号或虚拟机刷接口

🔧 二、技术实现细节

✅ 1. 基于 IP 限流

对访问频率高的 IP 设置访问上限:

# Redis限流示例:每个IP每分钟只能访问10次
ip_key = f"limit:{ip_address}"
count = redis.incr(ip_key)
if count == 1:redis.expire(ip_key, 60)  # 设置1分钟过期
if count > 10:return "Too many requests", 429

适合接口:短信验证码、注册、登录、敏感操作。


✅ 2. 给接口加验证码

当用户触发“频繁操作”行为时,加一道图形验证码或滑块验证。

示例

  • 连续点击“获取验证码”按钮超过2次 → 弹出图形验证码

  • 失败登录超过5次 → 要滑动验证

常用方案:

验证类型说明
图形验证码传统的“输入下图文字”方式
滑动验证码腾讯云、极验验证码等
点选图标“请点选所有的猫” 等人机验证

✅ 3. 使用 Token 限制接口访问权限

很多接口只能在登录状态下访问,或需要传递一个有效的 API token。

例子:

GET /api/send-code
Authorization: Bearer eyJhbGciOiJIUzI1...

如果没有合法 token,直接拒绝访问,防止匿名恶意请求。


✅ 4. 给接口加冷却时间(验证码类经典)

比如:

  • 每个手机号每60秒只能发送一次验证码;

  • 同一个账号每天最多发送 5 次验证码。

用 Redis 实现:

key = f"cooldown:{phone}"
if redis.get(key):return "Too frequent", 429
redis.setex(key, 60, "1")  # 设置60秒冷却期

✅ 5. 使用滑动窗口限流算法(更精细)

不同于 Redis 的简单计数,这种方式记录多个时间戳:

时间窗口 = 1分钟
若过去1分钟内请求数 > 10,则拒绝

适合用在中大型项目中,Redis 或网关中集成。


✅ 6. 使用 API 网关限流工具

许多云服务(如 Nginx + Lua、Kong、Envoy、阿里云API网关)都有限流功能。

例子:

limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;server {location /api/ {limit_req zone=req_limit burst=10 nodelay;}
}

含义:同一 IP 每秒最多访问5次,最多可突发10次。


✅ 7. 行为分析 + 机器学习防刷(高级)

企业常用方式:

  • 结合访问路径、时间间隔、鼠标轨迹、设备ID、IP地区等特征;

  • 判断是否为脚本行为,自动拉入风控系统;

如支付宝、微信等都会对登录、转账等操作做 AI 风控。


🔒 三、防刷策略组合应用(实战示例)

验证码接口:/send-code

类型策略
限速每个手机号每分钟一次,IP 每小时最多 20 次
身份登录后才允许请求验证码(防刷注册)
图形验证码多次请求后弹出图形验证
阈值每个账号/手机号每天最多请求 5 次

🧪 四、测试建议

  1. 自己用脚本模拟高频调用接口,观察日志和限流是否生效;

  2. 使用 Apache Benchmark (ab) 或 locust 进行压力测试;

  3. 查看 Redis、网关是否正确记录并限制请求。

下面是一个使用 Flask + Redis 实现滑动窗口限流的接口示例,可以有效防止恶意刷接口请求,比如“短信验证码接口”。


🧠 限流目标设定

规则: 每个 IP 地址在过去 60 秒内最多访问 5 次 /send-code 接口。


📦 所需依赖

pip install flask redis

 🧱 项目结构

rate_limit_project/
├── app.py        # Flask主程序
└── limiter.py    # 滑动窗口限流模块

🔧 limiter.py(滑动窗口限流核心逻辑)

# limiter.pyimport time
import redisr = redis.Redis(host='localhost', port=6379, db=0)def is_allowed(ip: str, max_requests=5, window_seconds=60) -> bool:now = int(time.time())key = f"rate_limit:{ip}"# 移除窗口外的时间戳r.zremrangebyscore(key, 0, now - window_seconds)# 当前请求数量current_count = r.zcard(key)if current_count >= max_requests:return False# 添加当前时间戳(score 和 value 都是当前时间)r.zadd(key, {str(now): now})r.expire(key, window_seconds)return True

🚀 app.py(主接口逻辑)

# app.pyfrom flask import Flask, request, jsonify
from limiter import is_allowedapp = Flask(__name__)@app.route('/send-code', methods=['GET'])
def send_code():ip = request.remote_addrif not is_allowed(ip):return jsonify({"code": 429, "msg": "请求太频繁,请稍后再试"}), 429# 模拟发送短信验证码return jsonify({"code": 200, "msg": "验证码已发送(假装的😄)"})if __name__ == '__main__':app.run(debug=True)

🧪 测试方式

连续请求超过 5 次 /send-code

curl http://localhost:5000/send-code

第 6 次起应该会返回:

{"code": 429,"msg": "请求太频繁,请稍后再试"
}

✅ 优势

  • 基于时间戳的滑动窗口比简单计数更精准;

  • Redis 存储时间戳,自动过期,性能高;

  • 可轻松扩展:按用户 ID、IP、Token 等限流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

github 项目迁移到 gitee

1. 查看远程仓库地址 git remote -v 2. 修改远程仓库地址 确保 origin 指向你的 Gitee 仓库,如果不是,修改远程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…

探索大语言模型(LLM):目标、原理、挑战与解决方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言语言模型的目标语言模型的数学表示语言模型面临的挑战解决参数量巨大的方法1. 马尔可夫假设2. 神经网络语言模型3.自监督学习4. 分布式表示 脑图总结 前言 在自…

Kubernetes》》k8s》》Namespace

Namespace 概述 Namespace(命名空间) 是 Kubernetes 中用于逻辑隔离集群资源的机制,可将同一集群划分为多个虚拟环境,适用于多团队、多项目或多环境(如开发、测试、生产)的场景。 核心作用: 资…

FFUF指南

ffuf 的核心功能: 目录/文件发现: 通过暴力破解(使用字典)探测目标网站的隐藏目录或文件,例如: ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚举: 通过模糊测试发现目标…

Qt通过ODBC和QPSQL两种方式连接PostgreSQL或PolarDB PostgreSQL版

一、概述 以下主要在Windows下验证连接PolarDB PostgreSQL版(阿里云兼容 PostgreSQL的PolarDB版本)。Linux下类似,ODBC方式则需要配置odbcinst.ini和odbc.ini。 二、代码 以下为完整代码,包含两种方式连接数据库,并…

为什么浮点数会搞出Infinity和NAN两种类型?浮点数的底层原理?IEEE 754标准揭秘?

目录 什么是NAN? 不同编程语言的NaN 为什么浮点数会搞出Infinity和NAN两种类型? 浮点数 小数点位置浮动的原因 浮点数和整数 浮点数指令 精确性 浮点数的类型 为什么叫浮点数? 小数点位置浮动的原因 IEEE 754起源于intel公司 IEEE 754标准 编程语言的浮点数都…

Node.js Session 原理简单介绍 + 示例代码

目录 ✅ Session 原理简要说明 🧩 示例项目 - 使用 Node.js Express 实现简单 Session 登录 📁 文件结构 🔹 server.js (JavaScript) 🔸 index.html (HTML) ▶️ 程序运行步骤 ✅ 程序运行效果 🎯 总结 在 We…

实战交易策略 篇十六:猎豹阿杜打板交易策略

文章目录 系列文章狙击涨停板的十大要诀炒股大成者,必具“三商”系列文章 实战交易策略 篇一:奥利弗瓦莱士短线交易策略 实战交易策略 篇二:杰西利弗莫尔股票大作手操盘术策略 实战交易策略 篇三:333交易策略 实战交易策略 篇四:价值投资交易策略 实战交易策略 篇五:底部…

Opentelemetry 项目解读

Opentelemetry 解读 1. 什么是 Opentelmetry Ot 统一了可观测的三个重要维度:分别是 Trace,Log,Metrics。 在没有 ot 之前,不同维度的可观测组件都是不同的: 在 Trace 领域:skywalking 一直很受欢迎&am…

与终端同居日记:Linux指令の进阶撩拨手册

前情提要: 当你和终端的关系从「早安打卡」进阶到「深夜代码同居」,那些曾经高冷的指令开始展露致命の反差萌—— man 是那个永远在线的钢铁直男说明书,只会说:"想懂我?自己看文档!"&#xff08…

Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合

摘要 本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP,主要包含以下内容。 1. 一些 MCP 基础与快速体验(熟悉的读者可以跳过此部分) 2. 如何将自己开发的 Spring 应用发布为 MCP Server,验…

【面试向】欠拟合和过拟合、正则化(Regularization)

训练集、验证集和测试集泛化误差过拟合(Overfitting)和 欠拟合(Underfitting)如何区分过拟合和欠拟合?欠拟合 —— 在训练集和验证集上都表现很差过拟合 —— 在训练集上表现很好,但在验证集或测试集上表现…

ClawCloud的免费空间(github用户登录可以获得$5元/月的免费额度)

免费的空间 Welcome to ClawCloud Lets create your workspace 官网:ClawCloud | Cloud Infrastructure And Platform for Developers 区域选择新加坡 然后这个页面会变成新加坡区域,再按一次确定,就创建好了工作台。 初始界面&#xff0…

Spring Boot + Caffeine:打造高性能缓存解决方案

1. 引言 1.1 缓存的重要性 缓存是提升系统性能的关键技术之一,通过将频繁访问的数据存储在内存中,减少对数据库或其他外部系统的访问次数,从而降低延迟并提高吞吐量。 缓存的基本概念:缓存是一种临时存储机制,用于快速访问常用数据。缓存在提升系统性能中的作用:减少数…

每天学一个 Linux 命令(24):chattr

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/24/index.html 每天学一个 Linux 命令(24):chattr 命令简介 chattr(Change Attribute)用于修改文件或目录的底层属性(如防删除、防修改),这些属性比普通权限更严格。常用于保护重要文件或优化文件系统行为。…

【java 13天进阶Day04】常用API、正则表达式,泛型、Collection集合API

Math类的使用。 Math用于做数学运算。Math类中的方法全部是静态方法,直接用类名调用即可。方法: public static int abs(int a) 获取参数a的绝对值public static double ceil(double a) 向上取整public static double floor(double a) 向下取整public s…

如何系统地入门学习stm32?

如何系统地入门学习stm32? 作为一个在嵌入式领域摸爬滚打十余年的工程师,看到这个问题,我不禁想起自己当年啃着厚重的数据手册,对着一块蓝色的PCB板冥思苦想的日子。STM32的学习之路,说难不算特别难,说简单…

考公:数字推理

文章目录 1.真题12 312 530 756 ()-3 3 1 12 17 ()356 342 333 324 ()30 28 27 25 () 2215105 1494 1383 1272 ()2 3 8 21 46 ()4/25 1/4 4/9 1 ()39 416 630 848 ()5 8 11 17 () 10714 21 40 77 () 229 2.数字推理方法2.1 差值法2.2 比值法(乘法关系)2.…

自动化测试相关协议深度剖析及A2A、MCP协议自动化测试应用展望

一、不同协议底层逻辑关联分析 1. OPENAPI协议 OPENAPI 协议核心在于定义 API 的规范结构,它使用 YAML 或 JSON 格式来描述 API 的端点、请求参数、响应格式等信息。其底层逻辑是构建一个清晰、标准化的 API 描述文档,方便不同的客户端和服务端进行对接…

2025.04.17【Dendrogram】生信数据可视化:Dendrogram图表详解

Dendrogram customization Go further with ggraph: edge style, general layout, node features, adding labels, and more. Customized circular dendrogram Learn how to build a circular dendrogram with proper labels. 文章目录 Dendrogram customizationCustomized c…