文件
workbuddy-portal/SECURITY.md
T
wangchuanli 23799b4ea5 feat(oss): 补齐开源声明体系(MIT + 第三方声明 + 贡献/安全/行为准则)
* LICENSE              —— MIT
  * THIRD-PARTY-NOTICES  —— 依赖清单、再分发合规说明(含随仓库分发的
                            Apache ECharts 5.6.0 / Apache-2.0)与自查清单
  * CONTRIBUTING.md      —— 开发环境、五层验证、必须遵守的不变量、提交规范
  * SECURITY.md          —— 漏洞私有报告渠道、已有措施、已知非目标
  * CODE_OF_CONDUCT.md   —— 改编自 Contributor Covenant 2.1
  * .github/             —— Bug 报告 / 功能建议表单 + PR 模板
  * .editorconfig        —— 与 .gitattributes 保持一致
  * 全部 Python / Shell 源文件加 SPDX-License-Identifier: MIT 头
  * README 增加「开源与许可」章节与许可标识
2026-09-14 16:15:26 +08:00

3.5 KiB
原始文件 Blame 文件历史

安全策略(Security Policy)

支持范围

本项目按「自托管、局域网内使用」的定位开发。安全修复只针对当前主分支与最新发布版本。

版本 是否接受安全修复
1.1.x(当前) ✅
< 1.1 ❌ 请先升级

如何报告漏洞

请不要在公开 Issue 里贴出可直接利用的细节(含真实 Cookie、secret_key、可复现的绕过步骤)。

请通过以下任一私有渠道联系维护者:

  • 邮件:<安全联系邮箱>(占位,待维护者补全)
  • 或通过代码托管平台(Gitea)的站内私信联系仓库管理员

请在报告里尽量包含:

  1. 受影响的版本 / 提交号
  2. 复现步骤与最小复现(可脱敏)
  3. 影响范围(能读到什么、能改到什么)
  4. 如果有,你建议的修复方向

我们会在 7 天内确认收到,并在修复发布后于 CHANGELOG 里致谢(除非你希望匿名)。

设计上已有的安全措施

理解这些边界,有助于你判断某个现象是「设计如此」还是「真的漏洞」:

项 做法 位置
全站鉴权 每个页面都有 @login_required,每个 /api/* 未登录返回 401 JSON workbuddy_portal/security.py、web/views.py
CSRF 所有写请求必须带 X-CSRF-Token,页面注入 window.WB_CSRF,服务端统一拦截 security.check_csrf
会话签名 Flask secret_key 由 data/instance.json 持有,首次启动随机生成 workbuddy_portal/config.py
口令存储 加盐哈希,不存明文 security.hash_password
凭据脱敏 云端 Cookie 是账号凭证:入库后页面与接口都不回传全文,只给「N 字符,结尾 …xxxx」 config.SECRET_KEYS、web/views.py
开放重定向 登录后的 next 只允许站内相对路径 web/views.py
TLS 校验 默认开启,不提供「关掉校验」的快捷开关(Cookie 不该裸奔) settings.ssl_verify
容器权限 运行层非 root(uid/gid 1000 app) Dockerfile

绝不入库:data/instance.json(含 secret_key)、data/usage.sqlite、logs/*、.env。 .gitignore 已覆盖;改动忽略规则后请用 git check-ignore -v <file> 逐条复核。

已知的非目标(部署方需自行处理)

本项目刻意不做下面这些,请按你的环境补齐:

  • 没有多租户与细粒度权限:登录用户即为管理员,能改配置、能看全部数据。
  • 没有限流与账号锁定:公网暴露前请置于反向代理的 rate limit 之后。
  • 没有强制 HTTPS:请由反向代理(nginx/Caddy)终止 TLS。
  • 没有备份机制:备份策略需要你自己定(见 docs/DEPLOYMENT.md)。
  • 不建议直接暴露到公网:设计前提是局域网或 VPN 内使用。
  • Cookie 的获取方式由使用者负责:手动从浏览器复制。请勿把该 Cookie 分享给他人, 它的权限等同于你的账号;轮换后记得在「配置管理」页更新。

部署前的最小检查清单

  • 已修改默认管理员口令(WB_ADMIN_PASSWORD),不再是 admin123
  • data/ 与 logs/ 目录的权限只对服务账号可读写
  • 前面有反向代理并启用了 HTTPS
  • 确认 data/instance.json 没有被提交到任何仓库
  • 已规划备份(SQLite 库是唯一正本)