Appearance
法律与合规部署指导
本页面向部署者/运营者:如何配置 NOJ 的法律与合规能力,使其满足《个人信息保护法》(PIPL) 及相关法规要求的「告知—同意—行权」闭环。
免责声明:本页为工程与部署指导,不构成法律意见。实际合规判断请结合部署主体、 用户群体与适用法规,必要时咨询专业人士。
0. 能力总览
| 能力 | 入口 | 说明 |
|---|---|---|
| 隐私政策 / 服务条款 | 后台「法律与合规」 | Markdown 编辑 + 版本化发布(不可变历史) |
| 注册同意 | 注册页 | 未勾选无法注册;记录版本/时间/IP/UA |
| 政策变更通知 | 全局弹窗 | 发布「重大变更」后,登录用户被要求重新同意 |
| 备案信息 | 后台「法律与合规」→ 备案与主体 | 页脚展示;未配置不显示 |
| 内容审核 | 后台「系统设置 → 内容合规审核」 | 腾讯云 TMS / 阿里云内容安全等 |
| 个人信息导出 | /api/v1/users/me/data-export | PIPL 查阅/复制权 |
| 删除/更正请求 | /api/v1/legal/data-requests | 内容类权利请求通道 |
| 时间戳(可选) | 后台「法律与合规」→ 时间戳 TSA | 政策版本 RFC 3161 时间戳 |
1. 首次配置(上线前必做)
- 登录管理后台 →「法律与合规」。
- 发布隐私政策与服务条款:在对应 Tab 填写 Markdown 正文,点击「发布新版本」。
- 首次发布建议勾选「标记为重大变更」(使存量用户下次登录时确认)。
- 未发布前,注册仍可成功但不写入同意记录;请务必先发布再开放注册。
- 在「备案与主体」填写:个人信息处理者名称、联系方式、部署补充说明(存储区域、保留期限、 备份、第三方服务等)、ICP/公安备案号(未备案留空)。
- 如启用 LLM 评测,在「第三方服务」登记实际服务商(名称、用途、数据类型)。
OAuth 注册同样受硬门槛约束:第三方注册按钮在未勾选同意时禁用,授权请求携带
accepted_legal=true;回调新建账号时校验该标记,未同意一律拒绝建号。绑定已有账号 (intent=link)不建号,不受影响。若部署者尚未发布政策,OAuth 建号的同意记录为空 (与账号密码注册一致),请先发布政策。
登录页的第三方登录(2026-09-25 评审补齐):登录页的第三方按钮不携带
accepted_legal(老用户登录不应被迫重新勾选)。新账号经此入口登录时,回调会以oauth_error=legal_consent_required回到登录页,页面显示"去注册页勾选同意"的指引, 不会退化成"稍后重试"。因此:老用户走登录页不受影响,新用户按指引到注册页完成 同意后即可建号。部署者无需额外配置,但请确保注册页可访问(未关闭注册)。
2. 政策版本化与变更通知
- 版本不可变:每次「发布新版本」生成新版本行,历史保留,用于证明"用户当时同意的是哪一版"。
- 重大 vs 非重大:
- 勾选「重大变更」→ 登录用户下次访问时弹出不可关闭的同意弹窗。
- 未勾选(错字、排版)→ 不打扰用户,不要求重新同意。
- 建议仅在实质性条款变化(数据处理目的、范围、第三方、用户权利)时标记为重大。
3. 备案信息与页脚展示
- 有 ICP/公安备案号时填写,页脚会自动展示并链接到官方查询页。
- 境外托管(如香港)通常无需 ICP 备案,留空即可,页脚不显示备案位。
- 备案信息经
/api/v1/site/meta公开,请勿填入敏感内容。
4. 内容审核(腾讯云 TMS 等)
- 入口:后台「系统设置 → 内容合规审核」。
- 配置项:总开关、Provider(
mock/aliyun/tencent/none)、密钥、风险阈值、 人工复核阈值、异步队列开关、超时。 - 未接入时社区文本不送审;接入后帖子/评论/私信文本会异步送审,命中违规进入人工复核队列。
- 生产建议开启:UGC 平台的处置义务要求对违法违规内容可发现、可处置。
5. 留存期限
以下留存项可在后台「系统设置」对应分类配置(合规页「留存期限」Tab 提供聚合入口):
| 项 | 配置键 / 取值 | 默认 | 说明 |
|---|---|---|---|
| 审计日志 | audit_log_retention_days | 90 | 操作审计留痕保留天数(0 = 禁用清理) |
| 反作弊 IP | anti_cheat_ip_retention_days | 180 | 提交来源 IP 保留;到期置空,保留提交与成绩 |
| SSE 事件 | 源码常量(无配置键) | 7 | 实时事件日志保留,见 shared/sse/sse-events.ts 的 SSE_EVENT_RETENTION_DAYS |
前两项为 bootstrap(env-owned) 设置,改
.env后需重启 core;SSE 事件保留 当前不可配置(固定 7 天常量),表中列出仅供参考。
最小必要原则:留存期限应为实现处理目的所必需的最短时间,并与赛事申诉周期匹配。
6. 个人信息导出与删除/更正请求
- 导出:登录用户调用
GET /api/v1/users/me/data-export(或前端入口)导出本人 账户、提交、社区内容与同意记录的 JSON。前端入口在「设置 → 个人信息与隐私 → 导出我的数据」(下载 JSON 文件)。 - 删除/更正请求:用户在「设置 → 个人信息与隐私」提交并可查看自己的请求; 管理端在「法律与合规 → 删除/更正请求」Tab 按状态过滤并执行
受理(processing)/办结(resolved)/驳回(rejected)(状态机 pending → processing → resolved/rejected,终态不可回退)。 - 账户注销(软删除 + 匿名化)覆盖"账户删除";请求通道覆盖内容类(帖子/评论/提交)删除更正。
7. 时间戳 TSA(可选)
用于证明"某版政策文本在某时刻已存在",防"事后偷改条款"的质疑。
- 默认关闭(
tsa_provider=disabled)。仅在发布重大变更时打戳。 - Provider 选择:
freetsa/digicert:免费、RFC 3161,仅技术验证,不构成中国法律证据。custom:自填端点与根证书。中国法律场景建议接国内可信时间戳服务(如联合信任), 并确认其提供 RFC 3161 接口。
- 签发即校验:收到 TSA 响应后 NOJ 会校验并仅在全部通过时落库——
PKIStatus授权(拒绝响应不落库)、messageImprint等于政策content_hash、 CMS 签名有效、证书链随响应内嵌。任一不满足视为打戳失败(不阻塞发布,记为空)。 - 保存内容:原始
TimeStampToken、从 CMS 提取的真实证书链(tsa_chain)、 原始请求 TSQ(tsa_query,含 nonce)与签发时间tsa_timestamp。 - 离线复核的信任模型(2026-09-25 评审收紧):管理端可对任一版本调用
POST /api/v1/admin/legal/documents/:kind/versions/:version/verify-tsa(权限legal:manage),复核顺序为——imprint 算法必须是 SHA-256 且与版本content_hash一致 → CMS 签名有效 → 签名者证书在签发时刻处于有效期内 → 签名者证书由配置的tsa_root_cert签发。- 必须配置
tsa_root_cert:未配置时接口返回ok:false+trusted:false(同时给出signature_valid),因为它无法确认签发者身份—— token 内嵌的自签证书不能自我证明。请把 TSA 的根证书 PEM 填入 「法律与合规 → 时间戳 TSA」或TSA_ROOT_CERT。 - 只有
ok:true(即trusted:true)才可作为"某版文本在某时刻已存在"的证据;signature_valid:true但trusted:false仅说明结构完整、哈希一致。 - 该复核目前只提供 API(无后台按钮),可在需要时用 curl 调用留档。
- 必须配置
- 证书链长期保存:TSA 证书至少每 15 个月轮换,需连同证书链长期保存才能在未来验证旧时间戳(NOJ 已保存,见上)。
- 打戳失败记为无时间戳并告警,不影响政策发布。
8. 可能收集的信息(数据清单)
Neuro OJ 正处于开发迭代阶段,本清单可能未穷尽所有数据收集点,且随版本变化; 请以实际部署与最新政策为准。
| 类别 | 数据 | 第三方接收方 |
|---|---|---|
| 账户 | 用户名、邮箱、密码哈希、简介、头像、OAuth 绑定 | — |
| 认证 | TFA 密钥/恢复码、密码重置令牌、登录失败/封禁、签到记录 | — |
| 评测 | 代码、文件名、产物 URL、来源 IP、状态、耗时/内存 | — |
| 客观题 | 答卷、判分解析 | — |
| 社区 | 帖子、评论、点赞、收藏、关注、举报、处罚、通知 | 内容审核 Provider(文本) |
| 私信 | 消息文本、反应、已读、删除、会话偏好 | 内容审核 Provider(文本) |
| 审计 | 操作、目标、详情 JSON、IP | — |
| 反作弊 | 提交来源 IP(默认 180 天) | — |
| 搜索索引 | 内容副本、参与者 id | — |
| LLM 用量 | 完整 prompt 与参数(见 §8.1) | LLM Provider |
| 邮件 | 投递事件、抑制名单(邮箱) | 邮件 Provider |
8.1 关于 LLM 用量保留完整 prompt
NOJ 的 LLM 网关(llm_usage 表)保留完整 prompt 与调用参数。原因如下:
在 LLM 工程类题目中,发给模型的 prompt 本身就是选手提交内容的一部分。完整保留它, 是为了能够对选手提交进行事后审查、识别抄袭与串通作弊,并在必要时为平台内容安全 处置留存依据——例如当有人借 NOJ LLM Gateway 向模型投送违法或有害内容时,可作为 向模型服务商申诉、避免部署者 API 被误封的证据。
该保留以实现上述目的所必需为限,不用于其他用途。部署者应在隐私政策中如实告知 这一处理方式与目的。
9. 未成年人
- 注册同意文案已包含:"我已年满 14 周岁,或在监护人陪同下已阅读并同意《服务条款》与《隐私政策》"。
- 面向中学生的部署,建议在隐私政策中补充未成年人/监护人同意的说明条款。
10. 相关文件
- 设计文档:
dev-docs/superpowers/specs/2026-09-23-legal-compliance-and-announcement-separation-design.md - 后台管理指南:admin-guide.md
- 生产密钥轮换:production-secrets.md