Repository navigation
Practice Security
ChangYo edited this page Oct 26, 2026
·
3 revisions
校园工具的凭据很值钱:一个 Token 可能能读邮件、成绩、一卡通流水;一个 Cookie 可能能发帖、发信。这页讲怎么存、怎么用、怎么删,以及各平台的边界。
相关:jAccount 与校园会话、选课社区、传承·交大、第二课堂、水源社区、交大云盘、课堂视频。
| 凭据 | 例子 | 泄露后果 | 存放 |
|---|---|---|---|
| OAuth client secret | jAccount clientSecret、InfoPlus App secret |
可冒充应用 | 服务端 Secret Store;不进前端/仓库 |
| Access Token | jAccount access token、Open API token | 可读/写授权范围 | 内存或加密存储;短生命周期 |
| Refresh Token | jAccount refresh token | 可长期换取新 token | 加密存储;按密码级处理 |
| 邮箱密码 | 交大邮箱密码 | 可读全部邮件、发信 | 系统钥匙串/加密存储 |
| User API Key | 水源 key、选课社区 Key | 可读写授权范围 | 加密存储;客户端负责撤销 |
| 站点令牌 | 第二课堂 Bearer、传承 Auth
|
可读写本人活动/资料,可能消耗积分 | 加密存储;按密码级处理 |
| Cookie |
JAAuthCookie、_forum_session、_t
|
可冒充本人会话 | 持久 Session + 加密快照 |
| 签名 URL | Canvas S3、课堂视频 MP4 | 短期可下载 | 不落盘、不日志、不缓存 |
| SSH 私钥 | HPC/jCloud | 可登录服务器 |
~/.ssh + agent;不进应用数据库 |
原则:凭据只存在需要它的进程里。桌面应用里,凭据放主进程/系统钥匙串,不暴露给渲染层、不写进 localStorage。
- 系统钥匙串(macOS Keychain、Windows Credential Manager、Linux Secret Service)优先。
- Electron 可用
safeStorage加密后落盘;解密失败时保留原文件并提示重新配置,不要静默删除。 - 密码/Token 不写进:
- URL query
- 前端源码/localStorage
- Git 仓库/.env 提交
- 日志/错误报告/分析系统
- 模型上下文
- 临时文件:下载到临时路径,校验后
rename;失败时清理。 - 备份:如果导出配置,默认不带凭据;用户显式勾选也要二次确认。
- OAuth:只申请当前功能需要的 scope;不要「一次申请全部」。
- Open API:读写 scope 分开;能只读就只读。
- 数据资源 API:只申请获批字段;不要缓存超出用途的数据。
- Canvas:个人 Token 适合本人;做多用户应用要申请 Developer Key + OAuth,不要收集别人的 Personal Token。
- 水源:能
read就不write;write授权页明确写了「发布、编辑和删除内容」。 - 选课社区:Key 默认可写;不要把它交给会自动点评、投票或改选课记录的流程。
- 传承:下载会扣积分;只读浏览不要顺手触发下载或兑换。
- 第二课堂:报名是写操作;只读列表足够时,不要保存报名能力。
- 邮件:只读收件箱就能满足的场景,不要顺手拿发信权限。
- 数据库:应用账号只给需要的库/表权限;不要用 root。
- 校园会话放独立持久分区,不和普通浏览窗口混用。
- 会话 Cookie 只在对应域使用;不要发给第三方域、模型、日志。
- 请求重定向要小心:登录失效时可能被带到
jaccount.sjtu.edu.cn,不要把目标站点的 Cookie 带过去。 - 跨域请求默认不带凭据;需要时用显式白名单。
- 用户断开时:清 Cookie、清加密快照、调站点撤销(如果支持)。
- 多账号:不同账号不同分区;切换时先清干净。
写操作比读操作危险,因为它会改变真实世界。
- 执行前展示:目标、内容、影响范围。
- 高风险写操作(发信、提交表单、充值、卡务、签章)要二次确认;能用 TOTP 就做 step-up。
- 点赞/收藏这类低风险操作可以批量,但要幂等。
- 写超时不等于失败;先查状态,避免重复提交。
- 不要在后台自动重放写请求。
- 保留操作日志(脱敏),让用户能追溯。
- 邮件正文、私信、成绩、一卡通流水、流程表单、课堂内容都按私密数据处理。
- 只把完成当前任务所需的最少数据发给模型;发送前让用户知道会发什么、发给哪个模型。
- 默认不进入长期记忆/公开索引/共享数据集。
- 自动摘要/ASR/OCR 可能出错;展示时标来源,并提供回到原文/原视频的链接。
- 不把他人帖子、邮件、课堂录像、附件重新公开分发。
- 日志脱敏:学号、姓名、邮箱、主题、正文、Token、Cookie、签名 URL 都要处理。
| 平台 | 必须注意 |
|---|---|
| jAccount | 应用网址/回调要与申请一致;clientSecret 不进前端;不要用 password grant;登出只影响当前应用 |
| Open API | 按 scope 使用;不要用别人的 clientId;不要把 Token 放 URL 里分享 |
| 数据资源 API | 只能用于申请时声明的用途和获批字段;不得直接或变形后提供给第三方 [官方]
|
| InfoPlus | User Token 代表用户,System Token 代表应用;不能互相替代;写流程要用户确认 |
| Canvas | 个人 Token 适合本人;多用户应用走 Developer Key + OAuth;课堂录像属于课堂视频平台,不在 Canvas 文件接口中 |
| 水源 | 非官方客户端/脚本/API/RSS 需事先书面许可;没有许可不要发布第三方客户端;不要批量抓取/重新分发 |
| 选课社区 | 学生自建;评分和点评不代表学校;Key 可写;不要批量点评、刷票或替他人发点评 |
| 传承·交大 | 资料由用户上传,版权在教师和上传者;下载扣积分;不要批量抓取或重新分发 |
| 第二课堂 | 只读活动;报名会改个人记录;联系人信息不采集、不写日志 |
| 课堂视频 | 只读;不要上报观看记录/伪造进度;不要重新分发录像 |
| 教学信息服务网 | 只读本人数据;不要自动选课/抢课;不要高频请求 |
| Pan | 官方没有公开第三方 API;社区私有 API 不稳定,可能违反条款;不要把 UserToken 交给模型 |
| 邮箱 | 不要自动群发;不要读他人邮箱;附件下载后注意保存位置 |
| HPC/jCloud | SSH 私钥/项目 Token 按密码级处理;不要共享账号;遵守集群使用规范 |
推荐记录:
- 平台、方法、路径(去掉 query 中的敏感参数)
- 状态码、业务错误码、耗时
- 重试次数、最终结果
- 请求 ID(如果有)
不要记录:
-
Authorization、Cookie、User-Api-Key、client_secret - 签名 URL、
verifier - 邮件正文、私信、成绩、表单字段
- 完整响应体(除非脱敏)
错误上报前做一次 redaction;不要把整个 fetch 配置对象序列化。
- 用户断开连接:清本地凭据 + 清缓存 + 调站点撤销。
- 水源:
POST /user-api-key/revoke;站点没有管理界面,客户端必须自己做。 - 选课社区:删除 API Key(
DELETE /api/api-key/{id})。 - 第二课堂/传承:退出登录后重新取 token;服务端是否立即作废旧 token 未验证。
- OAuth:撤销 refresh token/access token;清本地会话。
- Canvas:删除 Personal Token(Canvas 设置里可以删)。
- 邮箱:删除本地凭据;服务器密码改了就失效。
- 数据:提供「清除本地缓存」;导出/备份默认脱敏。
- 凭据在系统钥匙串/加密存储,不在前端/日志/Git。
- 只申请了当前功能需要的 scope/字段。
- 会话 Cookie 只在对应域使用,断开时清理。
- 写操作有用户确认,超时不会自动重放。
- 发给模型的数据是最小集,用户知情。
- 日志脱敏,错误上报不含 Token/Cookie/正文。
- 第三方内容不重新分发。
- 水源/Pan 等有明确的合规说明。
- 提供了撤销/删除路径。
- 凭据加密、
safeStorage、会话快照:[实测 2026-09,Dela src/main/credentials.ts、campus.ts] - 水源 ToS、key 撤销、CSRF:
[官方/实测 2026-09] - 数据资源 API 用途限制:
[官方 2026-10-25,graphql/overview.html] - Canvas 个人 Token vs Developer Key:
[官方] - 课堂视频只读边界:
[实测 2026-10-06] - 三站凭据形态与写操作边界:
[实测 2026-10-26,只读]
- 2026-10-25:首版。合并凭据、会话、隐私、平台规则与检查清单。
- 2026-10-26:补选课社区、传承·交大、第二课堂的凭据分级与平台边界。
本 Wiki 记录的是开发实践,不是学校官方承诺。每个结论都标注证据与日期;校园平台会调整字段、权限和登录方式,动手前请按页面里的「最后验证」复核。发现过期内容请提 Issue 或直接改。