You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制JSON Schema中PATCH补丁可执行的操作类型?

JSON Patch接口操作白名单限制实现方案

现有逻辑说明

当前已完成面向JSON Schema的PATCH接口开发,核心补丁应用逻辑如下:

def patch(self, name, version):
  ...
  schema = Schema.get(name, version)
  serialized_schema = schema.patch_serialize()
  ...
  data = request.get_json()
  
  patched_schema = apply_patch(serialized_schema, data)
  serialized_data, errors = update_schema_serializer.load(
                patched_schema, partial=True)
  ...

符合预期的请求补丁格式示例:

[
  { "op": "replace", "path": "/config/notifications/", "value": "foo" },
  { "op": "add", "path": "/config/", "value": {} },
  { "op": "remove", "path": "/config/notifications/"}
]

需求为仅保留add、remove、replace三类操作的执行权限,拦截copy、move、test等其余类型操作。

具体实现方案

最稳妥的实现方式是在补丁执行前增加入参校验层,从入口过滤非法操作,避免非预期逻辑执行:

  • 第一步:定义操作白名单集合,固定允许执行的操作类型
  • 第二步:遍历请求传入的补丁数组,逐行校验每个操作的op字段
  • 第三步:检测到非法操作时直接返回400状态码和明确的错误提示,终止后续补丁应用流程

校验逻辑嵌入后的代码示例:

def patch(self, name, version):
  ...
  schema = Schema.get(name, version)
  serialized_schema = schema.patch_serialize()
  ...
  data = request.get_json()

  # 新增补丁操作校验逻辑
  ALLOWED_OPS = {"add", "remove", "replace"}
  for index, patch in enumerate(data):
      op = patch.get("op")
      if op not in ALLOWED_OPS:
          return {
              "code": 400,
              "msg": f"第{index+1}项补丁操作非法,类型{op}不在允许范围内,仅支持add、remove、replace三种操作"
          }, 400

  patched_schema = apply_patch(serialized_schema, data)
  serialized_data, errors = update_schema_serializer.load(
                patched_schema, partial=True)
  ...

提示:不建议依赖apply_patch底层的异常抛出做拦截,前置入参校验的逻辑可控性更强,不会受第三方JSON Patch库的版本、配置差异影响,同时可以返回更易理解的错误提示给调用方。
如果你使用的是jsonpatch这类主流第三方库,部分版本支持在调用apply_patch时传入allowed_ops参数直接配置白名单,可以根据所用库的文档灵活选择,但前置手动校验的兼容性是最高的。

内容的提问来源于stack exchange,提问作者ParthS007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:30:54