共计 2409 个字符,预计需要花费 7 分钟才能阅读完成。
不安全的 API 调用三大风险场景
-
数据泄露风险:未受保护的 API 可能被恶意爬虫扫描,导致敏感业务数据或用户信息外泄。我曾遇到一个案例,某电商平台的商品库存 API 因未做鉴权,被竞争对手批量爬取实时库存数据。

-
未授权操作风险:攻击者可能伪造请求执行高危操作。比如通过未加密的管理 API 删除生产数据库,或篡改 AI 模型训练参数。
-
资源滥用风险:开放的 API 端点可能被用于 DDoS 攻击或消耗计算资源。有开发者反馈其文本生成 API 被恶意刷调用,单日产生 $3000 的额外费用。
主流防护方案对比
- JWT 验证(推荐基础方案)
- 适合场景:需要灵活权限控制的内部系统
- 优势:无状态、支持细粒度权限声明
-
示例:
{"role":"data_reader","exp":1672502400} -
OAuth2.0(企业级方案)
- 适合场景:需要第三方接入的开放平台
- 优势:支持 token 刷新和范围限制
-
成本:需要维护授权服务器
-
IP 白名单(辅助方案)
- 适合场景:固定 IP 的服务器间通信
- 优势:网络层快速拦截
- 局限:不适用于移动端或动态 IP
Python Flask 防护实现
JWT 核心组件
# 生成令牌示例
from datetime import datetime, timedelta
import jwt
SECRET_KEY = 'your-256-bit-secret'
def generate_token(user_id):
payload = {
'sub': user_id,
'exp': datetime.utcnow() + timedelta(hours=1),
'scope': ['api:read', 'api:write'] # 权限声明
}
return jwt.encode(payload, SECRET_KEY, algorithm='HS256')
# 验证中间件
from functools import wraps
from flask import request, jsonify
def jwt_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = request.headers.get('Authorization')
if not token:
return jsonify({'error': 'Missing token'}), 401
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
request.user_id = payload['sub']
except jwt.ExpiredSignatureError:
return jsonify({'error': 'Token expired'}), 401
except jwt.InvalidTokenError:
return jsonify({'error': 'Invalid token'}), 401
return f(*args, **kwargs)
return decorated
频率限制实现
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
limiter = Limiter(
app,
key_func=get_remote_address,
default_limits=["200 per day", "50 per hour"]
)
@app.route('/api/v1/generate')
@limiter.limit("10/minute") # 业务敏感接口单独限流
@jwt_required
def generate_text():
# 业务逻辑
审计日志配置
import logging
from flask import g
# 创建审计日志器
audit_log = logging.getLogger('api_audit')
audit_log.setLevel(logging.INFO)
fh = logging.FileHandler('api_audit.log')
fh.setFormatter(logging.Formatter('%(asctime)s - %(message)s'
))
audit_log.addHandler(fh)
@app.after_request
def log_requests(response):
audit_log.info(f"{request.method} {request.path} -"
f"user:{g.get('user_id')} -"
f"status:{response.status_code}"
)
return response
Postman 测试流程
- 在 Headers 中添加:
Authorization: Bearer <your_jwt_token>-
X-Request-ID: uuidv4()(防重放攻击) -
对敏感请求开启 Body 签名:
- 计算
SHA256(body_content + timestamp) - 添加
X-Signature头
生产环境必备配置
- 密钥轮换:JWT 密钥至少每 90 天更换
- HTTPS 强制:配置 HSTS 头(max-age=31536000)
- 输入消毒:对所有接收参数进行正则验证
- 异常掩码:错误响应中过滤堆栈信息
- 版本隔离:不同环境使用独立密钥对
避坑指南
- Token 过期时间过长
- 错误做法:设置 7 天有效期的 JWT
-
修复方案:缩短为 2 小时,配合 refresh token 机制
-
日志记录敏感信息
- 错误示例:打印完整的 Authorization 头
-
正确做法:仅记录 token 前 6 位和后 3 位
-
IP 白名单维护不及时
- 典型问题:云服务器迁移后忘记更新白名单
- 解决方案:使用 AWS Security Group 等动态管理工具
开放思考题
- 如何在微服务架构下实现跨服务的权限传播?
- 对于需要临时提升权限的场景(如管理员操作),如何设计安全的审批流程?
(全文约 1500 字,完整代码示例见 GitHub 仓库)
正文完

