前后端分离之后,接口就是数据库的大门。门锁没配好,前端做得再漂亮也没用。
一、先盘点暴露面
很多团队说不清自己有多少接口。先让网关或框架导出路由清单,逐条标注:
- 是否需要登录、需要什么角色
- 是否对外网开放(公网、小程序、合作方)
- 是否含敏感操作(导出、批量查询、改价、退款)
- 是否有管理后台专用接口被误暴露在公网
盘点后通常会发现几类问题:测试接口未下线、内部接口无鉴权、老版本接口仍在运行。这三类是入侵最常用的入口。
二、鉴权与越权的区别
鉴权是"你是谁",越权是"你能碰什么"。两者都要做,缺一不可。
| 类型 | 表现 | 防法 |
|---|---|---|
| 未授权访问 | 接口不校验 token 也能调 | 统一拦截器,白名单显式声明 |
| 水平越权 | 改 orderId 就能看别人的订单 | 每次查询都带当前用户条件,不能只按 ID 查 |
| 垂直越权 | 普通用户调到管理员接口 | 服务端校验角色,不依赖前端隐藏按钮 |
| 批量导出 | 一次拉走全量数据 | 限制条数、加审批、导出留痕 |
前端隐藏菜单不算权限控制。所有判断都必须在服务端做一次。
三、限流与防刷
- 按账号:普通接口 10–60 次/分钟,导出类单独设更低阈值
- 按 IP:防爬与撞库,注意 NAT 后多人共用出口,阈值不能太死
- 按接口:登录、短信、支付回调这类高风险接口单独限流
- 熔断降级:下游异常时快速失败,避免雪崩
限流要返回明确的 429 与重试提示,而不是直接超时。否则调用方会加倍重试,反而放大压力。
四、敏感字段的最小化
- 返回字段按需给:列表接口不返回身份证、银行卡、详细地址
- 必须展示时做掩码,完整值走单独接口并二次验证
- 日志与错误信息脱敏,禁止打印完整 token、密码、证件号
- 传输强制 HTTPS,内部服务间也建议加密
- 存储加密:证件号、银行卡等字段加密落库,密钥与数据分离
错误信息是常被忽略的泄露源
把数据库报错原样返回给前端,等于告诉攻击者表结构和字段名。统一错误码,详细原因只写服务端日志。
五、监控、密钥与应急
- 监控异常调用:单账号高频、非工作时间批量拉取、大量 401/403
- 密钥不写进代码与前端,用配置中心或密钥管理服务,定期轮换
- 合作方接口用独立 appId 与密钥,权限最小化,可单独吊销
- 准备应急开关:可一键关闭某个接口或某个合作方,不必发版
- 每季度做一次接口安全自查,重点是新增接口是否纳入统一鉴权
最后一条最实际:新接口是风险主要来源。把"新增接口必须登记并过鉴权"写进发布检查单,比事后扫描有效得多。
#API安全#越权防护#限流#网络安全