如何限制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
相关产品推荐
相关产品推荐

