91 lines
2.9 KiB
Markdown
91 lines
2.9 KiB
Markdown
# 安全策略
|
||
|
||
## 报告安全漏洞
|
||
|
||
**请不要通过 GitHub Issue 公开报告安全漏洞。**
|
||
|
||
发现安全漏洞请通过以下渠道私密报告:
|
||
|
||
- 邮件:security@eazygame.cn
|
||
- 内部工单系统:Security 项目 → New Issue
|
||
|
||
报告时请包含:
|
||
1. 漏洞描述和影响范围
|
||
2. 复现步骤(最小化示例)
|
||
3. 影响的版本号
|
||
4. 建议的修复方案(可选)
|
||
|
||
**响应时间:** 24 小时内确认收到,5 个工作日内给出评估结果。
|
||
|
||
## 安全架构
|
||
|
||
### 权限三道防线
|
||
|
||
```
|
||
proxy.ts (路由级 bitmap) → requirePermission (Server Action 级) → usePermission (客户端级)
|
||
```
|
||
|
||
- **路由级**:`src/proxy.ts` 使用 bitmap 快速拦截未授权路由
|
||
- **Server Action 级**:每个 Action 必须调用 `requirePermission()`,或用 `@public` JSDoc 标记豁免
|
||
- **客户端级**:组件使用 `usePermission().hasPermission()` 控制元素显隐
|
||
|
||
### 认证与会话
|
||
|
||
- JWT/session ID 存储在 httpOnly + Secure + SameSite=Strict 的 Cookie 中
|
||
- 服务端环境变量不加 `NEXT_PUBLIC_` 前缀
|
||
- 环境变量使用 `@t3-oss/env-nextjs` + Zod 校验(`src/env.mjs`)
|
||
|
||
### 数据访问
|
||
|
||
- 前端禁止直接访问数据库,所有数据访问必须通过 `data-access.ts` 模块
|
||
- Server Action 必须使用 `requirePermission()` 进行权限校验
|
||
- 家长路由必须包含 `parentId` 和 `studentId` 双重权限校验,防止信息泄露
|
||
|
||
### 输入安全
|
||
|
||
- **禁止 `dangerouslySetInnerHTML`**(如必须使用,先用 DOMPurify 清洗)
|
||
- Server Action 输入使用 Zod 验证,验证失败返回结构化错误
|
||
- 注册/登录流程实施速率限制,防止暴力破解和邮箱枚举攻击
|
||
|
||
## 安全审计
|
||
|
||
### arch:scan 自动检测
|
||
|
||
`npm run arch:query -- violations` 会自动检测:
|
||
|
||
- **长文件**(>800 行):提示拆分,降低维护风险
|
||
- **Server Action 权限缺失**:识别未调用 `requirePermission` 的 Server Action(支持递归调用链识别)
|
||
|
||
### @public 豁免标记
|
||
|
||
登录前/公开/内部工具 Server Action 可用 `@public` JSDoc 标记豁免权限校验:
|
||
|
||
```ts
|
||
/**
|
||
* 注册 Action,登录前公开调用。
|
||
*
|
||
* @public 登录前公开 Action,豁免 requirePermission 校验。
|
||
*/
|
||
export async function registerAction(formData: FormData) {
|
||
// ...
|
||
}
|
||
```
|
||
|
||
**豁免场景:**
|
||
- 登录前 Action(注册、邮箱可用性检查、2FA 预检)
|
||
- 内部日志工具(audit-logger、change-logger、login-logger)
|
||
- 权限查询工具(isAdminRole、canConfigurePublicAiProvider)
|
||
- 登录后必经流程(onboarding 状态查询/完成)
|
||
|
||
## 依赖安全
|
||
|
||
- 定期运行 `npm audit` 检查已知漏洞
|
||
- CI 流水线包含 Trivy 安全扫描(`.trivyignore` 配置豁免项)
|
||
- 依赖升级通过 PR 审核,不允许直接推送 main 分支
|
||
|
||
## 数据保护
|
||
|
||
- 数据库备份:每日自动备份,每周 DR 演练
|
||
- 敏感数据(密码、2FA 密钥)使用 bcrypt/Argon2 哈希存储
|
||
- 日志不记录敏感信息(密码、token、个人身份信息)
|