多源输入函数的事件契约构建指南
Serverless 函数多源输入导致的供应链安全风险及防护最佳实践
多源输入函数最容易出问题的地方,不是业务逻辑本身,而是入口对“事件是什么、来自哪里、能否信任”缺少统一且可执行的契约。HTTP 请求、对象存储事件、消息事件、电子邮件、API 网关和函数间调用,在协议、编码、字段结构及身份信息上都可能不同。若它们先被压缩成一个宽松的通用对象,再交给业务代码处理,某个来源就可能绕过原有校验,成为恶意数据进入后续依赖、资源访问和运行时环境的入口。
先定义事件的信任边界
事件契约不应只是字段清单,还要明确来源、版本、身份、处理语义和失败策略。每类事件至少需要回答几个问题:允许哪些事件类型,必要字段是什么,字段的数据类型和长度边界是什么,哪些字段会影响文件路径、资源标识、命令参数或查询条件,事件是否允许重复处理,以及关联资源是否属于预期范围。
入口校验应遵循由外到内的顺序:先识别来源和事件类型,再验证身份、结构和字段边界,最后才进入业务处理。未知事件类型应直接拒绝;无法确认来源的消息,不应触发高权限操作。对于文件名、对象路径、外部 URL 和查询条件等高风险字段,应采用允许列表、规范化处理或结构化参数传递,避免原始输入直接参与命令、表达式和路径拼接。
验证通过后,应将事件转换成内部对象,并让业务代码只接触这个对象,而不是继续读取未经验证的原始事件。这样可以把“输入可信”变成明确的阶段性事实,避免后续函数、依赖库或运行时扩展重复解释不完整的数据。
契约还要覆盖生命周期
多源事件往往涉及重试和重复投递,因此契约必须说明幂等要求、时间范围和异常处置。重复事件不能因为再次执行就造成额外写入、删除或高权限调用;过期事件、结构异常事件和关联资源不匹配的事件,应进入隔离或人工处理路径,而不是无限重试。
契约变更也不能只修改解析代码。字段新增、类型调整、来源身份变化或处理边界变化,都应同步更新校验逻辑、依赖清单、审计记录和部署对象。对来自其他云服务的事件,应保留来源、校验结果、事件标识和函数版本等关联信息,便于定位究竟是哪条入口把问题数据带入处理链路。
一个成熟的多源输入契约,最终应形成清晰的责任链:来源负责证明事件身份,入口负责验证结构和边界,内部对象负责隔离原始数据,业务逻辑负责执行有限动作,运行身份负责限制可访问资源。只要其中任一层仍默认“事件天然可信”,契约就只是文档,而不是实际的安全控制。

参与讨论
这种分层校验的思路确实必要