API 接口安全加固实战
前言
前后端分离、小程序、APP、第三方对接场景下,API 已经成为业务数据交互的核心通道。和传统 Web 页面不同,API 大多返回 JSON 数据,没有前端页面渲染,很多传统 WAF 规则很难识别漏洞,越权、未鉴权、重放攻击、批量赋值等 API 专属漏洞层出不穷。
OWASP API Security Top10 里,对象级越权 BOLA 是目前 API 漏洞里最高发、危害最大的一类漏洞。很多开发只做登录鉴权,却忽略数据权限校验;或者只依赖前端控制可见性,后端不做校验,攻击者抓包修改 ID 直接读取他人数据。
本文结合 OWASP API Top10,从鉴权、权限控制、请求防篡改防重放、参数校验、限流熔断、数据返回、网关、测试审计,完整落地 API 安全加固方案,附带代码示例、配置模板、自查清单,适合后端开发、接口测试、网关运维、安全工程师阅读。
免责声明:本文仅用于 API 安全学习、授权环境测试。禁止在未授权业务系统进行接口探测、越权测试、重放攻击,未经授权的安全测试违反《网络安全法》,需要承担法律责任。
一、API 高频漏洞梳理(OWASP API Top10 核心风险)
- BOLA 对象级越权(API1):登录成功后,修改请求里的 ID、订单号、用户 ID,读取 / 修改其他用户数据,是渗透测试中最常挖到的高危漏洞。示例:
GET /api/order/10086,修改订单 ID 即可拿到别人订单。 - 鉴权失效(API2):接口缺少 Token 校验、弱口令 API Key、JWT 未校验签名、过期 Token 仍然可用;
- 对象属性越权(API3,批量赋值 Mass Assignment):前端只传普通字段,攻击者追加管理员、isAdmin、balance 等后台敏感字段,直接修改权限。
- 无限制资源消耗(API4):无限流,可无限调用接口暴力破解、查询超大分页,数据库查询拖垮服务;
- 功能级权限越权(API5):普通用户可以调用管理员接口,比如删除用户、查看后台统计接口;
- 敏感业务流无防护(API6):支付、提现、优惠券兑换等高风险接口,缺少签名、防重放,可重复扣款。
- SSRF 服务端请求伪造(API7):API 支持传入 URL,服务端访问内网地址,探测内网资产。
- 安全配置错误(API8):CORS 配置为
*、返回详细堆栈、未开启 HTTPS、暴露 Swagger 文档到公网。 - 资产管理不当(API9):遗留旧版本接口、下线接口没有删除,存在僵尸 API,没有纳入安全管理。
- 不安全调用第三方 API(API10):调用外部接口时,未校验返回数据,存在注入、命令执行风险。
API 漏洞特点:漏洞大多不在注入 XSS 这类传统 Web 漏洞,而是权限逻辑缺陷,WAF 很难检测,必须后端代码层面修复。
二、API 加固核心实战方案(从请求入口到响应出口)
2.1 传输层:强制 HTTPS,杜绝明文传输
所有对外 API 强制 HTTPS,禁用 HTTP。
- 关闭 TLS1.0/1.1,只保留 TLS1.2、TLS1.3,使用安全加密套件;
- 配置 HSTS 响应头,强制浏览器走 HTTPS;
- 内部高安全接口(服务间调用),可以启用 mTLS 双向证书认证,客户端和服务端互相校验证书,防止中间人劫持。
❌坑:内网开发环境图省事使用 HTTP,上线忘记切换,导致 Token、API Key 明文传输,抓包直接窃取凭证。
2.2 身份认证方案选型(不同场景选择合适鉴权)
表格
| 场景 | 推荐鉴权方式 | 注意事项 |
|---|---|---|
| APP / 小程序 / 网页用户接口 | JWT(AccessToken+RefreshToken) | JWT 不要存放敏感数据;服务端维护黑名单,支持主动失效 |
| 第三方系统对接、服务间调用 | API Key + HMAC 签名 | API Key 不要放在 URL 参数,放在请求 Header |
| 支付、资金等高敏感业务接口 | HMAC-SHA256 签名 + 时间戳 + Nonce | 必须防篡改、防重放 |
| OAuth 第三方登录 | OAuth2.0 | 限定 scope 权限,不授予全部权限 |
JWT 使用避坑
- 必须校验签名,禁止
none算法; - 设置合理过期时间,AccessToken 短时效(5~30 分钟),RefreshToken 单独管控;
- JWT 本身无法主动失效,退出登录、账号封禁场景,需要 Redis 维护 Token 黑名单;
- 不要在 JWT payload 存放手机号、身份证等敏感隐私数据。
API Key 规范
- API Key 放在请求 Header(
X-API-Key),禁止放在 URL、请求 Body; - 密钥不能硬编码写死在代码、前端、配置文件;
- 密钥定期轮换,支持一键禁用。
2.3 权限控制:杜绝越权(重中之重)
权限分为两层:功能级权限 + 对象级数据权限,两层都必须校验,权限校验一定要放在后端,前端隐藏只是展示控制,不能作为安全防护。
- 功能级权限 RBAC
接口执行前,校验当前登录用户角色是否允许调用该接口。例如普通用户不能调用/api/admin/user/delete。 - 对象级权限 BOLA 防护
拿到请求里的资源 ID 后,必须查询数据库校验资源归属人是否等于当前登录用户 ID。
伪代码示例:
// 错误写法:直接根据订单ID查询,没有归属校验
Order order = orderMapper.selectById(orderId);
// 正确写法:同时校验订单归属用户
Order order = orderMapper.selectById(orderId);
if (!order.getUserId().equals(currentUserId)){
return "无权限访问该订单";
}
- 防止批量赋值 Mass Assignment
接收请求参数,使用白名单,只接收允许的字段,忽略所有未定义字段。
SpringBoot 示例:使用@JsonIgnore、@RequestBody只接收指定 DTO 字段,禁止直接用数据库实体类接收前端入参。
核心原则:永远不信任前端传入的 ID、user_id、角色字段。
2.4 防篡改、防重放攻击(支付、提现、兑换接口必上)
攻击者抓包截取合法请求,重复发送,造成重复扣款、重复发放福利。
完整防重放校验流程:
- 请求 Header 携带 3 个参数:
timestamp(UTC 毫秒时间戳)、nonce(随机唯一字符串)、sign签名; - 服务端第一步校验时间戳:当前时间与请求时间差值,超过 5 分钟直接拦截;
- 校验 nonce:查询 Redis,判断该随机串是否已经存在;存在说明重复请求,直接拦截;不存在存入 Redis,TTL 设置为时间窗口有效期;
- 签名校验:客户端把请求参数、timestamp、nonce 按照固定字典排序拼接,使用 AppSecret 做 HMAC-SHA256 生成签名;服务端用同样算法计算签名对比,不一致说明参数被篡改;
- 全部校验通过,才执行业务逻辑。
注意:Secret 不能在前端 APP 明文存放,客户端 Secret 存在被逆向的风险,高安全场景建议后端代理请求。
2.5 请求入参校验,JSON Schema 校验,防御注入与非法参数
所有接口入参,在进入业务逻辑前,统一校验,白名单优先。
- 校验参数类型、长度、取值范围、正则格式;
- JSON 接口推荐使用 JSON Schema,定义请求体结构,不允许携带额外未知字段;
- 防御 SQL 注入:参数化预编译,禁止直接拼接 SQL;
- 防御 XSS:如果接口数据会返回前端页面,输出做编码;
- 限制请求 Body 最大大小,防止超大 JSON payload,拒绝递归 JSON,抵御 DoS 攻击;
- 分页参数强制限制最大 pageSize,不允许一次性拉取上万条数据。
2.6 限流、熔断、降级,防御暴力破解与 CC 攻击
在 API 网关层统一限流,不要只在业务代码里做。
- 限流维度:IP、账号 ID、Token、客户端 APPID;
- 算法:单机可用令牌桶,分布式使用 Redis 滑动窗口;
- 分级限流:登录、验证码接口严格限流,防止暴力破解;普通查询接口放宽;高风险支付接口限流更严格;
- 熔断机制:依赖的下游接口异常时,快速熔断,避免服务雪崩。
示例:登录接口限制同一账号,1 分钟最多 5 次请求,多次失败锁定账号。
2.7 响应数据控制:最小返回原则,数据脱敏
- 最小返回原则:API 只返回业务必需字段,不要直接返回数据库实体全部字段,避免过多数据泄露;
- 敏感字段脱敏:手机号、身份证、银行卡号,返回时掩码;密码、密钥绝对不返回;
- 关闭详细错误堆栈:报错只返回统一业务错误码,不要返回 SQL 异常、代码行号、服务器路径;
- CORS 跨域配置:不要配置
Access-Control-Allow-Origin: *,只信任指定域名;限制Access-Control-Allow-Methods,禁止 OPTIONS 滥用。
2.8 API 网关层统一安全管控
使用 API 网关(Spring Cloud Gateway、Kong、APISIX)统一处理安全能力,避免每个业务重复开发鉴权、限流、日志:
- 统一鉴权校验,非法请求直接在网关拦截,不转发后端;
- 统一限流、IP 黑名单、请求大小限制;
- 拦截恶意 Payload,WAF 联动;
- 统一日志采集,记录请求 ID、客户端 IP、账号、请求参数、响应结果;
- 资产管控:下线废弃 API、僵尸接口,统一接口版本管理(v1/v2)。
2.9 接口文档与资产管控
- 生产环境禁止公网直接访问 Swagger、Knife4j 文档,仅内网或者 VPN 访问;
- 梳理全部 API 资产,建立 API 清单,记录接口地址、鉴权方式、权限、风险等级;
- 废弃旧版本接口及时下线,僵尸 API 是高危突破口;
- 接口版本化管理,新旧接口分开,旧接口逐步淘汰。
2.10 日志、监控与告警
- 日志字段:请求 ID、请求时间、客户端 IP、账号 Token 标识、请求方法、接口地址、入参、响应码、耗时;敏感参数(密码、银行卡)脱敏再写入日志;
- 日志留存不少于 6 个月;
- 告警规则:高频 401/403 鉴权失败、大量越权尝试、大额业务操作、异常大分页查询,触发实时告警;
- 日志统一投递至 SIEM,方便入侵溯源。
三、API 安全上线前自查清单
表格
| 分类 | 检查项 | 状态 |
|---|---|---|
| 传输安全 | 全部 API 强制 HTTPS,关闭 HTTP | |
| 身份鉴权 | 所有接口必须鉴权,无匿名高危接口;JWT/API Key 规范 | |
| 权限校验 | 功能级权限校验;所有资源接口校验对象归属,防御 BOLA 越权 | |
| 参数安全 | 入参白名单校验;禁止直接接收数据库实体,防御 mass assignment | |
| 高风险接口 | 支付 / 兑换接口启用 HMAC 签名 + 时间戳 + nonce 防重放 | |
| 限流防护 | 网关配置限流,登录接口防暴力破解,限制分页最大值 | |
| 返回数据 | 响应字段最小化;手机号身份证脱敏;关闭详细异常堆栈 | |
| 跨域 | CORS 不使用 *,仅配置可信域名 | |
| 资产文档 | 生产环境 Swagger 不对外暴露;梳理僵尸 API 并下线 | |
| 日志监控 | 接口日志完整记录,敏感字段脱敏,异常行为告警 |
四、常见开发误区
❌误区 1:前端控制权限,后端不用校验
前端只是 UI 控制,抓包修改请求即可绕过,所有权限校验必须后端实现。
❌误区 2:登录了就安全,不用校验资源归属
BOLA 越权就是登录成功,但是可以访问别人数据,这是 API 最常见高危漏洞。
❌误区 3:JWT 加密了,里面可以存放敏感信息,JWT 可以永久有效
JWT 是 Base64 编码,不是加密,任何人拿到 Token 可以直接解析 payload;JWT 本身不能主动失效。
❌误区 4:接口没有页面,WAF 可以不用配置
JSON 格式的攻击载荷很多 WAF 识别困难,安全重心要放在代码和网关校验。
❌误区 5:只测正常业务流程,不测试修改 ID、批量赋值、重放场景
常规功能测试很难发现越权漏洞,必须单独做安全测试。
五、API 安全测试实战思路(授权环境)
- 越权测试:登录 A 用户,拿到资源 ID,替换到 B 用户请求,验证能否访问;横向越权、垂直越权(普通用户调用管理员接口);
- 批量赋值测试:额外增加 isAdmin、role、balance 等字段,看后端是否接收;
- 重放测试:抓取请求,重复发送,观察是否重复执行业务;
- 参数篡改:修改 ID、分页大小,测试是否可以超量拉取数据;
- 未鉴权测试:删除 Token,直接调用接口;
- 边界测试:超大分页、超长参数、异常 JSON 结构。
六、总结
API 安全和传统 Web 安全最大区别:API 漏洞大多是业务逻辑漏洞,WAF 很难发现,核心风险集中在越权、鉴权失效、重放攻击、批量赋值。
加固顺序:传输加密 → 身份认证 → 双层权限校验(功能 + 对象) → 入参校验 → 签名防重放(高风险接口) → 限流熔断 → 响应脱敏 → 网关管控 + 日志审计。
API 安全不是一次性上线加固,需要持续资产盘点、定期安全扫描、接口变更安全评审,持续发现僵尸接口、权限漏洞。
一句话记住:API 防护核心,登录不等于有权限;每一次访问资源,都要校验用户是否拥有该资源的访问权限;高风险接口加签名 + 时间戳 + 随机串防重放。
最后
网络安全需要学习那些知识
网络安全零基础入门学习路线&规划
初级
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!

7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.
零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫; ·PHP基本语法学习并书写一个简单的博客系统; 熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选); ·了解Bootstrap的布局或者CSS。
8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。

网络安全工程师企业级学习路线

视频配套资料&国内外网安书籍、文档&工具
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

一些我自己买的、其他平台白嫖不到的视频教程:

要学习网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。
机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!
这份完整版的学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

967



被折叠的 条评论
为什么被折叠?



