RSC PAYLOAD / TWO-GATE CHECKPOINT

Props 双闸门检查站

一个值能穿过 React Server Components 边界,只说明 React 会传;它是否应该出现在浏览器里,是另一道必须单独回答的安全题。

两道关,两种问题第一关:React 能否序列化?
第二关:用户是否应该看到?

把 props 放上检查线

点按候选值,或把它拖进第一道闸门;键盘用户直接用候选按钮即可完成同一操作。

候选值料盘

React 19 支持的类型不只 JSON。

INPUT
  • 可由 React 表示
  • 会在第一关拦截

双闸门与 DTO 白名单

类型检查通过后,仍要执行最小公开策略。

GATE A → B

闸门 A · REACT 可序列化

等待候选值

选择或拖入一个值,检查它能否跨越 Server / Client 边界。

○ 等待投件

以下六个数据库字段当前都是字符串,因此已经通过闸门 A;字符串内容仍可能是秘密。

闸门 B · 是否适合公开:勾选准备公开的字段。条件字段需要再确认业务用途与授权,秘密字段没有放行选项。

DTO 字段白名单
displayName"小虎" 面向用户的显示字段,可按页面需要公开。
avatarUrl"/avatars/xiaohu.webp" 公开头像地址;仍应避免返回存储层多余信息。
email"xiaohu@example.com" 个人信息:默认不公开,是否需要取决于页面用途。
internalRole"course_editor" 内部角色可能泄露权限模型;按最小化与授权判断。
apiToken"sk_live_••••" 字符串能过第一关,但秘密绝不能进入浏览器。■ 硬拦截 · 不可覆盖
passwordHash"$2b$12$••••" 哈希不是安全的公开版本;客户端永远不需要它。■ 硬拦截 · 不可覆盖
闸门 B 放行2 个最小公开字段可以进入浏览器。 2 PASS

把两个问题分开问

DTO 白名单不是为了“修复序列化”,而是为了明确控制浏览器最终能看到哪些字段。

可序列化
React 能表示并跨边界传输。
不等于公开安全;秘密字符串照样可序列化。
Server Function
普通函数规则的明确例外,可从客户端调用。
参数由客户端控制,服务端仍必须验证输入、认证与授权。
条件字段
email、内部角色没有全局统一答案。
从具体页面用途出发,按最小化原则和当前用户授权决定。
硬秘密
令牌、密码哈希、私钥不进入 DTO。
不要依赖 RSC Payload 难读、环境变量命名或前端隐藏来保密。