直接抛出异常对象到json响应极危险,必须剥离堆栈、路径、行号等敏感上下文;仅返回标准化结构:错误类型、用户友好消息、错误码及时间戳,所有字段硬编码,禁用反射和动态注入,并通过环境变量控制调试信息,上线前自动移除。

直接把异常对象扔进 JSON 响应是危险的——堆栈里常含文件路径、行号、内部函数名甚至环境变量,一并返回前端等于主动交出系统地图。关键不是“能不能转”,而是“该转什么、怎么转才安全”。
只提取必要信息,剥离执行上下文
异常本身(如 ValueError)和它的 str(e) 消息可以保留,但完整 traceback 必须丢弃。不要调用 traceback.format_exc(),更不能序列化 sys.exc_info() 返回的元组。
- 记录完整堆栈到服务端日志(带唯一 request_id 关联),供排查用
- 响应体中仅返回:错误类型名称(如
"ValidationError")、用户友好的提示消息(如"邮箱格式不正确")、可选的标准化错误码(如"ERR_EMAIL_INVALID") - 避免在消息中拼接原始异常字符串,防止泄露内部逻辑,例如不用
f"数据库写入失败: {e}",而用预设文案
统一错误响应结构,禁用动态字段注入
API 错误响应不该是裸异常的 toString(),而应遵循固定 schema,比如:
用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...
{
"error": {
"code": "ERR_AUTH_EXPIRED",
"message": "登录已过期,请重新登录",
"timestamp": "2026-05-02T07:14:00Z"
}
}
- 所有字段名硬编码,不从异常对象反射生成(如不取
e.__dict__或vars(e)) - 禁用
json.dumps(e.__dict__)类操作,防止意外暴露自定义异常的私有属性 - 若需扩展字段(如表单校验失败的具体字段),通过白名单键名显式赋值,而非遍历异常属性
开发与生产环境差异化处理
本地调试时可临时启用详细堆栈,但必须由环境变量控制,且绝不进入生产部署。
- 检查
os.getenv("DEBUG") == "true"再决定是否附加debug_info字段 - 该字段内容也需过滤:剔除绝对路径(替换为
"<project_root>/..."</project_root>)、隐藏密码类关键字(如"password","secret") - 上线前确保构建流程自动移除或覆盖 debug 配置,不依赖人工开关
使用安全序列化工具做兜底
即便做了以上控制,仍建议对整个错误响应体再过一遍安全序列化层,防漏网之鱼。
- Python 可用
jsonpickle.unpickle(..., safe=True)反序列化后验证类型,或用safe-json-value类思路预处理字典 - Node.js 推荐
safe-json-value库,它会自动跳过函数、循环引用、不可枚举属性等高危项 - Java 中 Jackson 可配置
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES = false,但注意这是反序列化侧,响应序列化侧应配合@JsonInclude(NON_NULL)和自定义序列化器
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!








