From 5ed175efe17ae1f9fe159795a4e395b34a8cebef Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Mon, 1 Jun 2026 11:01:42 +0800 Subject: [PATCH] =?UTF-8?q?docs(changelog):=20=E7=AE=A1=E7=90=86=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E5=BA=9F=E5=BC=83=20action=20=E7=AB=AF=E7=82=B9?= =?UTF-8?q?=E6=8B=92=E7=BB=9D=E4=B8=8A=E6=9E=B6/=E4=B8=8B=E6=9E=B6?= =?UTF-8?q?=E5=8A=A8=E4=BD=9C=20(product-v2=20=E5=AE=A1=E8=AE=A1=20PR=20#3?= =?UTF-8?q?292/#3297)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._product_action_endpoint_reject_publish.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 changelogs/2026-06/02_fix_product_action_endpoint_reject_publish.md diff --git a/changelogs/2026-06/02_fix_product_action_endpoint_reject_publish.md b/changelogs/2026-06/02_fix_product_action_endpoint_reject_publish.md new file mode 100644 index 0000000..e1744fb --- /dev/null +++ b/changelogs/2026-06/02_fix_product_action_endpoint_reject_publish.md @@ -0,0 +1,51 @@ +# 【管理后台】废弃的产品状态变更端点 `/{id}/action` 现拒绝上架/下架方向动作 + +> **类型**: 后端安全收敛(废弃端点动作白名单) +> **服务**: hl-product-service-v2 +> **日期**: 2026-06-01 +> **影响范围**: `POST /admin/product/item/{id}/action`(产品状态变更-旧端点) +> **归属**: 后端已改(PR #3292 + #3297 → dev,已同步 dev-v3) +> **状态**: 已部署测试服并验证通过 +> **关联工单**: 无(审计驱动修复) +> **需前端配合**: ⚠️ 是(若管理后台仍在用该旧端点做上架/下架) + +--- + +## 一、背景(安全问题) + +审计发现旧端点 `POST /admin/product/item/{id}/action` 把前端传入的 `action` 直接喂给状态机,**未做动作合法性收敛**。任何持有该产品数据权限的普通管理员,只要传 `action=DIRECT_PUBLISH`,即可: + +- 跳过审批流程 +- 跳过行程完整性 / 车型必填的硬校验 +- 把一个行程为空的产品**瞬间上架**到小程序端 + +属于「审批绕过 + 越权 + 校验缺失」三合一,必须收敛。 + +## 二、后端改动 + +该端点本就标了 `@Deprecated`。现在加入**动作白名单**: + +- ✅ **仅放行** `WITHDRAW`(撤回,PENDING_REVIEW → DRAFT,把权限往回收,无风险) +- ❌ **拒绝** 所有上架/下架/审批方向动作(`DIRECT_PUBLISH` / `SUBMIT_PUBLISH` / `UNPUBLISH` / `FORCE_UNPUBLISH` 等),返回: + +```json +{ "code": 400406, "message": "动作「DIRECT_PUBLISH」不允许通过该接口执行,上架/下架请改用 toggle-publish 接口", "success": false } +``` + +## 三、前端需要做(mmg) + +**如果管理后台目前是用 `/{id}/action` 这个端点做产品上架/下架/提交审批,需要改用下面的专用端点**(这些端点已存在、且内置了审批 + 完整性校验 + 超管权限判断,是正确做法): + +| 原来(旧端点)走 action | 改用专用端点 | +|---|---| +| 上架 / 下架(`DIRECT_PUBLISH`/`SUBMIT_PUBLISH`/`UNPUBLISH`/`FORCE_UNPUBLISH`) | `POST /admin/product/item/{id}/toggle-publish`(后端按当前状态 + 操作人角色自动判方向:超管直接上下架,普通用户走提交审批) | +| 完成设计(CUSTOM 定制产品) | `POST /admin/product/item/{id}/complete` | +| 撤回(PENDING_REVIEW → DRAFT) | 仍可用 `/{id}/action` 传 `WITHDRAW`,或一并迁到对应交互 | + +> 如果管理后台**已经在用 `toggle-publish` / `complete`**(而 `/action` 只用于撤回或根本没在用),则**无需任何改动**,本次纯属后端堵漏。请前端确认一下当前上架/下架走的是哪个端点。 + +## 四、测试服实测(经网关 9443 + 真 admin token) + +- `action=DIRECT_PUBLISH` → `400406` 拒绝,产品未上架 ✓ +- `action=SUBMIT_PUBLISH` → `400406` 拒绝 ✓ +- `action=WITHDRAW` → `200 状态变更成功`(正常放行) ✓