Azure APIM validate-content策略未按预期拦截无关JSON请求问题
validate-content策略未拦截无关JSON请求排查方案
问题根因
你推测的方向完全正确,异常行为由两个Schema配置缺失共同导致:
- 根对象未声明必填规则:你的
AddressBody根节点仅定义了address、name两个属性的类型,但没有通过required字段声明这两个属性为必填项。之前能正常触发拦截的请求示例,是因为携带了name对象,而name子节点你配置了必填字段校验,缺失fistName时才会被拦截;当请求完全不带address、name字段时,因为根节点没有必填约束,不会触发必填校验失败。 - 默认允许未定义的额外属性:JSON Schema 规范默认
additionalProperties参数值为true,即允许对象出现未在properties中显式声明的字段。你当前所有Schema层级都未配置该参数,因此请求携带Schema外的无关字段时,原生校验逻辑不会判定为非法。第三方校验站点如果默认开启了严格校验模式才会拦截这类请求,和网关默认的原生JSON Schema校验逻辑存在差异。
你之前尝试添加request representation未生效,是因为仅关联了原有未修正的Schema,没有补全上述两个核心配置,因此校验行为不会发生变化。
修复方案
修改OpenAPI 3.0规范中的Schema定义,补全两个配置即可:
- 给所有需要严格校验的对象节点添加
additionalProperties: false,禁止出现未定义的额外字段,该配置按对象层级独立生效,嵌套对象需要单独配置 - 给根对象
AddressBody添加required声明,标记必填字段
修正后的Schema片段如下:
components: schemas: AddressBody: type: object additionalProperties: false required: - address - name properties: address: type: string example: "01 Auckland" name: type: object additionalProperties: false required: - fistName - lastName properties: fistName: type: string example: Fist Name lastName: type: string example: Last Name
注意事项
- 修改完OpenAPI定义后需要重新发布/更新API配置,确保最新Schema同步到网关校验逻辑中
- 你当前的
validate-content策略XML配置本身没有问题,action="prevent"、Content-Type匹配规则均配置正确,Schema修正后即可正常拦截非法请求 - 如果业务上允许特定层级携带扩展字段,可以仅在需要严格校验的层级配置
additionalProperties: false,不必全量开启
内容的提问来源于stack exchange,提问作者Hello All
相关产品推荐
相关产品推荐

