内容 API 的关系过滤没做净化,接口会多返回哪些数据
内容接口的关系过滤没做查询净化时,会多返回哪些数据?直接的回答是:端点会把关联表里未声明的字段一并吐出,常见的有多层关联上的作者内部标识、口令哈希这类凭证形态数据、订单与用户分组字段、草稿与未发布内容。判断不靠猜测,而是把响应体里实际出现的键与接口文档声明的字段求差集,差集里的每一项都属于不该公开的数据。成因链条也清楚:过滤条件来自查询串,本身就是外部输入,未经净化就进入查询构造与结果序列化两道环节,读权限的边界于是被绕过。
过滤条件为什么是输入
关系过滤一般让调用方指定三件事:按哪个关联字段筛选、关联取回到第几层、是否同时返回某张关联表的记录。这三件事的参数全部来自请求方,与表单字段一样不可信。程序若把它们直接拼进查询语句,SQL 注入就有了着力点;若过滤条件的回显未经处理就渲染到页面,XSS 就有了入口;若取回深度不受限制,关联链上的敏感字段会自然漏出。所以防线不能只压在 JWT 鉴权一层:鉴权回答「谁能调」,净化回答「能传什么、能带回什么」,两层各自独立,缺任何一层都会留下可读的暴露面。过滤语法应当当成配置项治理,而不是当成便捷特性随意放开。
当天口径的版本区间
开源内容管理程序里有能对号的先例,Strapi 的关联过滤信息暴露公告编号为 CVE-2026-27886,严重级别九点三分,受影响版本自 4.0.0 起至 5.37.0 之前,修复落在 Strapi 5.37.0,出处登记在 GitHub Advisory 数据库的同一编号里。这里只复述公告事实与自查入口,不展开任何利用过程。可迁移的规律是:停留在旧发布线上的站点需要主动升级,仅看访问日志看不出字段级暴露;公告给出的受影响区间要逐段对照自己的部署版本。
参数边界自查清单
| 参数类型 | 主要风险 | 白名单做法 |
|---|---|---|
| 关联字段名 | 拼进查询触发 SQL 注入,或读到未授权关联表 | 按内容模型声明可过滤字段集合,集合外直接拒绝 |
| 取回深度 | 层数过大带出关联链上的凭证类字段 | 限定最大层数,超出按上限截断并记告警 |
| 排序与分页 | 列名反射进查询语句 | 仅接受已登记列名,数值转整数并设上限 |
| 比较运算符 | 被扩展成任意条件组合 | 只开放有限比较语义,其余写法拒绝 |
| 返回字段选择 | 未声明字段随响应体返回 | 端点固定输出字段清单,多余键在序列化层丢弃 |
落地顺序建议从返回字段开始,它只改输出层、风险最低;再处理关联字段名与运算符,这两项触及查询构造;最后收紧取回深度。
鉴权与文档的配合
接口文档是暴露面的账面工具,每个端点应写清可读字段、可过滤字段与允许的取回深度。声明多于代码所需就删到够用;声明少于实际需要,调用方会自造过滤语法去试探,反而放大风险。API 调用按最小权限发放鉴权令牌,读取类与写入类分开授权,后台管理类端点不放进公开令牌的能力范围。站点自身的防御链也要成对配置:内容敏感词过滤守住入库,SQL 注入与 XSS 的防线分别守在查询与渲染两处,缺哪一处就从哪一处补。升级之前先跑一遍回归用例,把关联取数、字段裁剪与深度限制三类断言写进用例集,确认字段返回与文档一致后再对外服务。
常见问题
问:接口返回了文档里没有的字段,算不算漏洞? 答:属于信息暴露的征兆。先比对多余字段是否涉及凭证形态数据或未发布内容,涉及就按缺陷处理并收紧输出层;只是冗余展示字段时,补进接口文档并说明用途。
问:只做好鉴权能不能挡住这类多返回? 答:不能。鉴权控制调用方身份,过滤语法仍在同一身份的能力范围内生效,合法调用方同样能让端点多带出关联字段,净化与字段白名单必须独立于鉴权存在。
问:前台确实要展示多层关联数据,怎么同时避开 SQL 注入与 XSS? 答:把深度与字段交给服务端决定,前端只传业务语义的选择项;查询侧走参数化与列名白名单,渲染侧对回显内容做转义,两段分开治理,不靠单点过滤。