diff --git a/docs/OPEN_PLATFORM_INTEGRATION.md b/docs/OPEN_PLATFORM_INTEGRATION.md index b68671e..8f6e1e6 100644 --- a/docs/OPEN_PLATFORM_INTEGRATION.md +++ b/docs/OPEN_PLATFORM_INTEGRATION.md @@ -204,10 +204,31 @@ open-platform: > 同类风险可能还有其它「无 `@PreAuthorize` 的 GET 接口」。彻底收口需要先把 > `SecurityConfig` 里 GET 的 `/**` 白名单摘掉,再按真实流量补显式白名单, > 影响面较大,建议单独排期。 -> -> 已知同一族的两个问题(本次未动,因为属于内部接口行为变更): -> `GET /api/system/user/withoutAuth` 免登录且可返回用户实体(含密码哈希), -> `GET /api/system/user/page` 等接口返回的实体也带密码字段——两者都应该改为按需 VO。 + +### 6.1 用户密码哈希可通过免登录接口读取(未修复,优先级高) + +`GET /api/system/user/getByUserId/{userId}` 在 `SecurityConfig` 的 GET 白名单里, +实测**无需任何凭证**,只带一个 `tenantId` 请求头即可取到用户实体, +而响应里包含 `password` 与 `payPassword` 两个 BCrypt 哈希字段: + +```bash +curl -H 'tenantId: <任意租户ID>' 'https://server.websoft.top/api/system/user/getByUserId/<用户ID>' +# => {"code":0,"data":{"userId":..., "password":"$2a$10$...", "payPassword":"..."}} +``` + +根因有两点叠加:`User` 实体对 `password` / `payPassword` 没有做序列化限制, +且 `UserMapper` 使用 `SELECT a.*`;同时该接口无 `@PreAuthorize` 又落在 GET 白名单里。 +`GET /api/system/user/withoutAuth` 属于同一族(免登录 + 返回实体)。 + +最小修复是在实体上把这两个字段设为只写: + +```java +@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) +private String password; +``` + +这样只影响序列化(不再输出),不影响任何依赖反序列化写入密码的流程。 +本次未改动,因为会变更既有内部接口的响应结构,需要你确认后单独提交。 ## 7. 如何新增一个开放接口