redfish 多reqbody 参数检验返回状态码异常

// 此模板仅供参考,如果不适用可以修改

问题描述

如图1所示,body 中设置两个参数时Duration 参数异常(配置的取值范围在1~255),IndicatorLED 参数正常,此时状态码200

如图二所示,单独设置异常Duration时,状态码400,报错body value 异常

为什么会出现这种情况呢?该怎么解决

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

[您希望实现什么]

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

分析结论

[详细总结您对此问题的分析结论]

答案内容由AI生成,仅供参考:

分析结论

项目 内容
根本原因 多参数请求中,Redfish 接口未对所有字段执行完整校验,导致非法 Duration 被静默忽略,未触发 400 错误。
违规标准 不符合 Redfish 协议要求:任何请求体字段非法均应返回 400。
可能根源 - ReqBody 配置缺失或不完整
- 校验逻辑存在短路行为
- 自定义 Lua 脚本绕过校验流程
解决方案 1. 完善 ReqBody 中 Duration 的 Range 校验
2. 强制启用 JSON Schema 全字段校验
3. 修正 Lua 脚本,确保先校验后处理
4. 统一返回策略:任一参数错误即返回 400

:white_check_mark: 最终目标:无论请求中包含多少参数,只要有一个字段不合法,就必须返回 HTTP 400 并提供详细的 @Message.ExtendedInfo 说明。

点击此处查看详细分析解答

Redfish 多 ReqBody 参数检验返回状态码异常问题分析

问题描述

在使用 Redfish API 接口进行请求时,发现如下异常行为:

  • 场景一:当请求体(Request Body)中同时包含两个参数 Duration 和 IndicatorLED,且 Duration 的值为非法值(如 0,合法范围应为 1~255)时,服务器返回 HTTP 状态码 200(成功),未对非法参数进行校验。

  • 场景二:当仅设置非法的 Duration 参数时,服务器正确返回 HTTP 状态码 400,并提示 "The value '0' for the property Duration is not in the supported range of acceptable values."。


实际响应内容

场景一:多参数请求(非法 Duration + 正常 IndicatorLED)

{
  "Duration": 0,
  "IndicatorLED": "Blinking"
}

:white_check_mark: 返回状态码:200 OK
:cross_mark: 问题:未对 Duration=0 进行范围校验

场景二:单参数请求(仅非法 Duration)

{
  "Duration": 0
}

:white_check_mark: 返回状态码:400 Bad Request
:white_check_mark: 返回错误信息:

{
  "error": {
    "code": "Base.1.0.GeneralError",
    "message": "A general error has occurred...",
    "@Message.ExtendedInfo": [
      {
        "MessageId": "openUBMC.1.0.PropertyValueOutOfRange",
        "Message": "The value '0' for the property Duration is not in the supported range of acceptable values."
      }
    ]
  }
}

原因分析

根据 知识图谱 和文档内容,可得出以下结论:

1. Redfish 接口的请求体校验依赖于 ReqBody 和 JSON Schema 配置

  • ReqBody 是 Redfish 接口中定义请求参数结构的核心组件。
  • 校验规则通过 ReqBody.Validator 定义,通常基于 JSON Schema 实现字段类型、范围、枚举等约束。
  • 根据 rule_resource_031(资源树方法请求体参数enum校验规则正确性检查)等规则,校验逻辑需满足:
    • 类型为字符串、数字等时才可配置 enum 或 range 校验;
    • 校验规则必须正确嵌套在 Properties 字段下。

:warning: 关键点:如果多个参数共存时,系统可能仅对部分参数执行校验,或校验逻辑存在短路行为(如优先处理第一个有效参数)。


2. 多参数场景下校验机制失效的可能原因

可能原因 说明
校验逻辑未覆盖所有字段 当 IndicatorLED 是一个合法且可快速处理的字段时,系统可能提前返回成功,跳过后续字段(如 Duration)的深度校验。
校验顺序或优先级问题 某些实现中,Redfish 接口映射逻辑(如 ProcessingFlow)可能按字段顺序处理,若前面字段通过,则整体视为“可接受”。
Patch 请求特性影响 若该接口为 PATCH 类型,Redfish 允许部分更新。某些实现允许忽略未知或非法字段而不报错(需看具体实现策略)。但此行为不符合规范。
ReqBody 配置不完整 如果 Duration 字段未在 ReqBody.Properties 中明确定义其 Range 校验规则,或者 Validator 缺失,则无法触发校验。
后端处理流程绕过校验 某些定制化插件(如 Custom Request Response Lua)可能在处理请求前未调用统一的校验流程,导致多参数时校验不一致。

3. 对比分析:为何单参数能触发 400?

  • 当仅发送 Duration: 0 时,系统必须对该字段进行解析和赋值。
  • 此时会进入完整的校验流程,触发 PropertyValueOutOfRange 错误。
  • 而在多参数场景中,系统可能将请求视为“部分成功更新”,并将非法值静默丢弃或记录日志但不阻断请求。

这属于 非标准化行为 —— Redfish 规范要求,只要请求体中有任何字段违反约束,就应返回 400 并拒绝整个请求。


解决方案建议

:white_check_mark: 1. 检查 ReqBody 配置是否完整

确保 Duration 字段在接口映射配置中有完整的校验定义:

"ReqBody": {
  "Type": "object",
  "Properties": {
    "Duration": {
      "Type": "integer",
      "Minimum": 1,
      "Maximum": 255,
      "Required": false
    },
    "IndicatorLED": {
      "Type": "string",
      "Enum": ["On", "Off", "Blinking"]
    }
  }
}

:magnifying_glass_tilted_left: 检查点:确认该配置是否存在于对应资源树接口定义中,是否被正确加载。


:white_check_mark: 2. 验证 JSON Schema 校验是否启用

  • 使用工具(如 json-schema-validator)测试该请求是否符合 Schema。
  • 确保 Redfish 服务端在接收请求时强制执行 Schema 校验,而不是选择性校验。

:pushpin: 提示:openUBMC 提供了 Redfish规范校验和Schema更新工具,可用于自动化检测接口合规性。


:white_check_mark: 3. 审查 Custom Request Response Lua 脚本

如果启用了 Custom Request Response Lua 自定义脚本:

function get_req_param(req_body)
  -- 是否在此处手动提取参数而绕过了校验?
end

:backhand_index_pointing_right: 必须确保:

  • 在处理请求前,调用统一的校验函数;
  • 不应直接从 req_body 提取并使用未经验证的数据。

:white_check_mark: 4. 统一返回策略:拒绝部分错误的请求

修改后端逻辑,遵循 Redfish 标准行为:

任何字段校验失败 → 返回 400 + ExtendedInfo 错误详情

{
  "error": {
    "code": "Base.1.0.GeneralError",
    "@Message.ExtendedInfo": [
      {
        "MessageId": "openUBMC.1.0.PropertyValueOutOfRange",
        "RelatedProperties": ["#/Duration"],
        "Message": "The value '0' for the property Duration is not in the supported range."
      }
    ]
  }
}

:white_check_mark: 5. 添加日志与调试信息

  • 在请求处理流程中增加日志,记录每个参数的校验结果。
  • 使用 openUBMC 提供的 Postman 或 curl 测试流程进行复现和验证。

示例测试命令:

curl -X PATCH https://<BMC_IP>/redfish/v1/Chassis/1 \
     -u username:password \
     -H "Content-Type: application/json" \
     -k \
     -d '{"Duration": 0, "IndicatorLED": "Blinking"}'

分析结论

项目 内容
根本原因 多参数请求中,Redfish 接口未对所有字段执行完整校验,导致非法 Duration 被静默忽略,未触发 400 错误。
违规标准 不符合 Redfish 协议要求:任何请求体字段非法均应返回 400。
可能根源 - ReqBody 配置缺失或不完整
- 校验逻辑存在短路行为
- 自定义 Lua 脚本绕过校验流程
解决方案 1. 完善 ReqBody 中 Duration 的 Range 校验
2. 强制启用 JSON Schema 全字段校验
3. 修正 Lua 脚本,确保先校验后处理
4. 统一返回策略:任一参数错误即返回 400

:white_check_mark: 最终目标:无论请求中包含多少参数,只要有一个字段不合法,就必须返回 HTTP 400 并提供详细的 @Message.ExtendedInfo 说明。


建议后续动作

  1. 运行 Redfish 规范校验工具(来自 openUBMC 工具链),检测所有接口是否符合 DMTF 标准;
  2. 启用接口映射配置语法检查,防止 ReqBody 配置遗漏;
  3. 编写自动化测试用例,覆盖“多参数含非法值”场景,防止回归。

:paperclip: 参考资料:

  • Redfish 官方规范:https://www.dmtf.org/standards/redfish
  • openUBMC 接口定制文档
  • 《Redfish接口常见错误&定位方法》搜索结果 #2
  • 《Redfish定制指南(开发中)》搜索结果 #8

2个参数,部分设置成功也会返回200,你拉到postman最下面会有个错误

redfish PATCH 接口只要有属性没有失败,就会返回200;请求体全部校验失败才会返回400

dmtf官方的redfish标准中7.6 PATCH章节也有规定:https://www.dmtf.org/sites/default/files/standards/documents/DSP0266_1.10.0.pdf

好的,谢谢,看了下确实是这样