feat(legal): update legal documents and add zh_Hant support
This commit is contained in:
@@ -0,0 +1,512 @@
|
||||
# COPPA 儿童保护与数据安全措施实施方案
|
||||
|
||||
**文档状态**: 草案
|
||||
**创建日期**: 2026-04-17
|
||||
**关联文档**: `docs/discussions/legal-compliance-us.md` 第七点、第八点
|
||||
|
||||
---
|
||||
|
||||
## 一、背景与法律要求
|
||||
|
||||
### 1.1 COPPA(儿童在线隐私保护法)要求
|
||||
|
||||
针对 13 岁以下用户,COPPA 要求:
|
||||
|
||||
1. **年龄验证**:必须采取合理措施验证用户年龄
|
||||
2. **禁止收集**:不得收集 13 岁以下儿童个人信息
|
||||
3. **隐私政策披露**:隐私政策必须明确说明不面向 13 岁以下用户
|
||||
|
||||
### 1.2 CCPA/CPRA 数据安全要求
|
||||
|
||||
针对数据安全措施,隐私政策声明的安全措施必须真实实施:
|
||||
|
||||
1. **加密措施**:AES-256 数据加密、TLS 1.3 传输加密
|
||||
2. **访问控制**:基于角色的访问控制(RBAC)
|
||||
3. **监控审计**:审计日志
|
||||
4. **泄露响应**:72 小时内通知机制
|
||||
|
||||
---
|
||||
|
||||
## 二、当前系统现状分析
|
||||
|
||||
### 2.1 用户认证流程
|
||||
|
||||
**现有实现**:
|
||||
- 认证方式:邮箱 + OTP(验证码)登录
|
||||
- 认证提供方:Supabase Auth
|
||||
- 用户表:`auth.users`(Supabase 内置)
|
||||
- 扩展表:`public.profiles`
|
||||
|
||||
**缺失项**:
|
||||
- ❌ 无年龄验证机制
|
||||
|
||||
### 2.2 数据安全现状
|
||||
|
||||
**已有措施**:
|
||||
- ✅ Supabase Auth 内置 JWT 认证(HS256 签名)
|
||||
- ✅ 数据库 RLS(Row Level Security)策略 - `anon`/`authenticated` 角色被禁止访问业务表
|
||||
- ✅ 日志敏感字段过滤(`core/config/settings.py` 的 `log_sensitive_fields`)
|
||||
- ✅ 软删除机制(`SoftDeleteMixin`)
|
||||
- ✅ 环境变量管理敏感配置
|
||||
- ✅ Supabase 托管服务默认启用 HTTPS + 数据库加密
|
||||
|
||||
**Supabase 安全特性**:
|
||||
- 传输加密:所有 API 请求强制 HTTPS
|
||||
- 静态数据加密:PostgreSQL 透明数据加密(TDE)
|
||||
- 密码哈希:bcrypt 自动处理
|
||||
- JWT 签名:HS256 算法
|
||||
- RLS 策略:细粒度行级访问控制
|
||||
|
||||
---
|
||||
|
||||
## 三、第七点:COPPA 儿童保护实施方案
|
||||
|
||||
### 3.1 年龄验证机制
|
||||
|
||||
**重要澄清:Apple 没有直接的年龄验证 API**
|
||||
|
||||
Apple 不提供可以获取用户具体年龄的 API。Apple 的年龄保护机制是通过以下方式实现的:
|
||||
|
||||
#### 方案一:App Store 年龄分级(推荐 - 主要防护)
|
||||
|
||||
**原理**:在 App Store Connect 中设置年龄分级,App Store 会自动阻止不符合年龄要求的用户下载。
|
||||
|
||||
**实施步骤**:
|
||||
|
||||
1. **登录 App Store Connect**
|
||||
2. **选择应用 → "App 信息" → "年龄分级"**
|
||||
3. **填写年龄分级问卷**
|
||||
4. **设置年龄分级为 12+(或更高)**
|
||||
|
||||
**年龄分级说明**:
|
||||
- **4+**:无 objectionable 内容
|
||||
- **9+**:可能包含轻微的卡通暴力/幻想暴力
|
||||
- **12+**:可能包含轻微的现实暴力/偶尔粗俗幽默/轻微模拟赌博
|
||||
- **17+**:可能包含频繁/强烈的现实暴力/成人内容
|
||||
|
||||
**设置 12+ 的效果**:
|
||||
- App Store 会阻止 12 岁以下用户下载应用
|
||||
- 家长控制功能会根据年龄分级限制儿童访问
|
||||
|
||||
**优点**:
|
||||
- ✅ 零成本,无需开发
|
||||
- ✅ Apple 系统级保护
|
||||
- ✅ 自动生效
|
||||
|
||||
**缺点**:
|
||||
- ⚠️ 仅防止下载,不能防止借用他人设备/账号
|
||||
- ⚠️ 用户可能谎报年龄注册 Apple ID
|
||||
|
||||
#### 方案二:应用内年龄声明(推荐 - 辅助防护)
|
||||
|
||||
**原理**:在注册流程中添加年龄确认 checkbox 或弹窗。
|
||||
|
||||
**实施步骤**:
|
||||
|
||||
1. **前端修改**:
|
||||
|
||||
```dart
|
||||
// apps/lib/features/auth/presentation/screens/login_screen.dart
|
||||
|
||||
// 在登录界面添加年龄确认 checkbox
|
||||
Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: _ageConfirmed,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_ageConfirmed = value ?? false;
|
||||
});
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
l10n.ageConfirmationText, // "我已年满 13 岁"
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
```
|
||||
|
||||
2. **后端验证**:
|
||||
|
||||
```python
|
||||
# backend/src/v1/auth/schemas.py
|
||||
|
||||
class EmailSessionCreateRequest(BaseModel):
|
||||
model_config = ConfigDict(extra="forbid")
|
||||
|
||||
email: str = Field(pattern=SUPABASE_EMAIL_PATTERN)
|
||||
token: str = Field(min_length=6, max_length=6)
|
||||
age_confirmed: bool = Field(
|
||||
default=False,
|
||||
description="用户确认年满 13 岁"
|
||||
)
|
||||
```
|
||||
|
||||
```python
|
||||
# backend/src/v1/auth/service.py
|
||||
|
||||
async def create_email_session(
|
||||
self, request: EmailSessionCreateRequest
|
||||
) -> SessionResponse:
|
||||
if not request.age_confirmed:
|
||||
raise AgeConfirmationRequiredError(
|
||||
detail="User must confirm age 13 or older to register"
|
||||
)
|
||||
|
||||
return await self._gateway.create_email_session(request)
|
||||
```
|
||||
|
||||
3. **数据库记录**:
|
||||
|
||||
```sql
|
||||
-- 在 profiles 表添加年龄确认字段
|
||||
ALTER TABLE profiles
|
||||
ADD COLUMN age_confirmed_at timestamptz,
|
||||
ADD COLUMN age_confirmation_method varchar(20) DEFAULT 'self_declaration';
|
||||
```
|
||||
|
||||
4. **本地化文本**:
|
||||
|
||||
```json
|
||||
// apps/lib/l10n/app_zh.arb
|
||||
{
|
||||
"ageConfirmationText": "我确认已年满 13 岁,或已获得家长/监护人同意使用本应用",
|
||||
"@ageConfirmationText": {
|
||||
"description": "年龄确认声明文本"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
// apps/lib/l10n/app_en.arb
|
||||
{
|
||||
"ageConfirmationText": "I confirm that I am 13 years of age or older, or have parental/guardian consent to use this app"
|
||||
}
|
||||
```
|
||||
|
||||
**优点**:
|
||||
- ✅ 实现简单
|
||||
- ✅ 满足 COPPA 最低合规要求
|
||||
- ✅ 记录用户确认时间和方式
|
||||
|
||||
**缺点**:
|
||||
- ⚠️ 依赖用户自我声明
|
||||
- ⚠️ 用户可能撒谎
|
||||
|
||||
#### 推荐方案:App Store 年龄分级 + 应用内年龄声明
|
||||
|
||||
**组合使用**:
|
||||
1. **App Store 年龄分级设置为 12+**(主要防护)
|
||||
2. **应用内注册时要求年龄确认**(辅助防护 + 合规记录)
|
||||
|
||||
**理由**:
|
||||
- App Store 分级阻止儿童下载(系统级保护)
|
||||
- 应用内确认作为法律合规证据(用户明确声明)
|
||||
- 双重保护,满足 COPPA 要求
|
||||
|
||||
### 3.2 隐私政策更新
|
||||
|
||||
**需要添加的内容**:
|
||||
|
||||
```markdown
|
||||
## 儿童隐私保护
|
||||
|
||||
本应用不面向 13 岁以下儿童。
|
||||
|
||||
**年龄限制**:
|
||||
- 您必须年满 13 岁才能使用本应用
|
||||
- 本应用在 App Store 的年龄分级为 12+,系统会阻止 12 岁以下用户下载
|
||||
- 注册时,您需要确认年满 13 岁
|
||||
|
||||
**数据收集**:
|
||||
- 我们不会故意收集 13 岁以下儿童的个人信息
|
||||
- 如果我们发现在未经许可的情况下收集了儿童的个人信息,我们将采取措施删除相关信息
|
||||
|
||||
**联系我们**:
|
||||
如果您认为我们可能收集了儿童的个人信息,请联系 privacy@xunmee.com。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、第八点:数据安全措施实施方案
|
||||
|
||||
### 4.1 加密措施
|
||||
|
||||
#### 4.1.1 传输加密(TLS)
|
||||
|
||||
**当前状态**:✅ 已满足
|
||||
|
||||
- Supabase 托管服务默认强制 HTTPS
|
||||
- 所有 API 请求使用 TLS 1.2/1.3 加密
|
||||
- 无需额外配置
|
||||
|
||||
**验证方式**:
|
||||
- 使用 SSL Labs 测试:https://www.ssllabs.com/ssltest/
|
||||
- 目标评级:A 或 A+
|
||||
|
||||
#### 4.1.2 静态数据加密(AES-256)
|
||||
|
||||
**当前状态**:✅ 已满足
|
||||
|
||||
- Supabase PostgreSQL 默认启用透明数据加密(TDE)
|
||||
- Supabase Storage 默认启用服务端加密
|
||||
- 无需额外配置
|
||||
|
||||
**用户输入是否需要加密字段存储?**
|
||||
|
||||
**回答:不需要**
|
||||
|
||||
理由:
|
||||
1. **当前数据类型不敏感**:
|
||||
- 用户输入主要是占卜问题、起卦数据
|
||||
- 不涉及身份证、信用卡、医疗健康等高敏感信息
|
||||
- 数据库已有 RLS 保护,只有 `service_role` 可访问
|
||||
|
||||
2. **加密成本**:
|
||||
- 应用层加密会增加查询复杂度(无法索引、无法搜索)
|
||||
- 增加开发和维护成本
|
||||
- 性能开销
|
||||
|
||||
3. **已有保护措施**:
|
||||
- 数据库 TDE(透明数据加密)
|
||||
- RLS 策略
|
||||
- JWT 认证
|
||||
- 传输加密
|
||||
|
||||
### 4.2 访问控制
|
||||
|
||||
#### 4.2.1 基于角色的访问控制(RBAC)
|
||||
|
||||
**当前实现**:✅ 已满足
|
||||
|
||||
- 数据库 RLS 策略:`anon`/`authenticated` 角色被禁止访问业务表
|
||||
- 后端 Service 层强制校验 `owner_id`
|
||||
- 只有 `service_role` 可以访问业务数据
|
||||
|
||||
**RLS 策略示例**(来自 `20260411_0001_initial_llm_schema.py`):
|
||||
```sql
|
||||
-- 所有业务表启用 RLS
|
||||
ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 禁止 anon 和 authenticated 角色访问
|
||||
CREATE POLICY anon_select_table_name ON table_name
|
||||
FOR SELECT TO anon USING (false);
|
||||
|
||||
CREATE POLICY authenticated_select_table_name ON table_name
|
||||
FOR SELECT TO authenticated USING (false);
|
||||
|
||||
-- 只有 service_role 可以访问(后端使用 service_role key)
|
||||
```
|
||||
|
||||
#### 4.2.2 Supabase 是否拒绝匿名用户登录?
|
||||
|
||||
**回答:是的**
|
||||
|
||||
- Supabase Auth 默认要求认证
|
||||
- 未登录用户只有 `anon` 角色
|
||||
- RLS 策略禁止 `anon` 角色访问业务表
|
||||
- 后端 API 依赖 JWT 验证用户身份
|
||||
|
||||
**验证流程**:
|
||||
```python
|
||||
# backend/src/v1/auth/dependencies.py
|
||||
|
||||
async def get_current_user(
|
||||
authorization: str | None = Header(default=None)
|
||||
) -> AuthUser:
|
||||
if not authorization:
|
||||
raise UnauthenticatedError() # 拒绝匿名访问
|
||||
|
||||
# 验证 JWT
|
||||
user = await verify_jwt(authorization)
|
||||
return user
|
||||
```
|
||||
|
||||
### 4.3 审计日志
|
||||
|
||||
#### 4.3.1 当前 points_audit_ledger 是否满足要求?
|
||||
|
||||
**回答:部分满足**
|
||||
|
||||
**points_audit_ledger 现状**:
|
||||
- ✅ 记录积分变更审计
|
||||
- ✅ 包含 `user_id_snapshot`、`user_email_snapshot`
|
||||
- ✅ 包含 `event_id`、`change_type`、`amount`
|
||||
- ✅ 包含时间戳 `created_at`
|
||||
- ❌ 只记录积分相关操作,不记录其他操作
|
||||
|
||||
**不满足的审计需求**:
|
||||
- ❌ 用户登录/登出
|
||||
- ❌ 账户删除
|
||||
- ❌ 个人信息修改
|
||||
- ❌ 数据导出请求
|
||||
|
||||
**建议:扩展审计日志系统**
|
||||
|
||||
```sql
|
||||
-- 创建通用审计日志表
|
||||
CREATE TABLE audit_logs (
|
||||
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id uuid REFERENCES auth.users(id) ON DELETE SET NULL,
|
||||
action varchar(50) NOT NULL,
|
||||
resource_type varchar(50) NOT NULL,
|
||||
resource_id uuid,
|
||||
old_values jsonb,
|
||||
new_values jsonb,
|
||||
ip_address inet,
|
||||
user_agent text,
|
||||
created_at timestamptz NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX ix_audit_logs_user_id ON audit_logs(user_id);
|
||||
CREATE INDEX ix_audit_logs_action ON audit_logs(action);
|
||||
CREATE INDEX ix_audit_logs_created_at ON audit_logs(created_at);
|
||||
|
||||
COMMENT ON TABLE audit_logs IS '通用审计日志:记录用户关键操作';
|
||||
```
|
||||
|
||||
**审计事件类型**:
|
||||
```python
|
||||
# backend/src/core/audit/events.py
|
||||
|
||||
class AuditAction(str, Enum):
|
||||
# 认证相关
|
||||
USER_LOGIN = "user.login"
|
||||
USER_LOGOUT = "user.logout"
|
||||
USER_DELETE = "user.delete"
|
||||
|
||||
# 数据操作
|
||||
PROFILE_UPDATE = "profile.update"
|
||||
DATA_EXPORT = "data.export"
|
||||
|
||||
# 积分相关(已有 points_audit_ledger)
|
||||
POINTS_CHANGE = "points.change"
|
||||
```
|
||||
|
||||
**实施优先级**:
|
||||
- P1:创建 `audit_logs` 表
|
||||
- P2:记录用户登录/登出
|
||||
- P3:记录账户删除
|
||||
- P4:记录个人信息修改
|
||||
|
||||
### 4.4 数据泄露响应
|
||||
|
||||
#### 4.4.1 响应流程文档
|
||||
|
||||
**文档位置**:`docs/security/incident-response.md`
|
||||
|
||||
**响应时间线**:
|
||||
|
||||
| 阶段 | 时间 | 行动 |
|
||||
|------|------|------|
|
||||
| 发现 | T+0 | 确认泄露范围和影响 |
|
||||
| 评估 | T+1h | 确定严重等级(低/中/高/严重)|
|
||||
| 控制 | T+4h | 阻止泄露继续,保留证据 |
|
||||
| 通知 | T+72h | 通知受影响用户(法律要求)|
|
||||
| 修复 | T+7d | 修复漏洞,加强防护 |
|
||||
| 复盘 | T+14d | 总结经验,更新流程 |
|
||||
|
||||
---
|
||||
|
||||
## 五、实施优先级与时间线
|
||||
|
||||
### 5.1 优先级矩阵
|
||||
|
||||
| 优先级 | 项目 | 预计工时 | 合规必要性 | 状态 |
|
||||
|--------|------|----------|------------|------|
|
||||
| P0 | App Store 年龄分级设置 | 0.5 天 | 必须 | 待实施 |
|
||||
| P0 | 隐私政策更新 | 0.5 天 | 必须 | 待实施 |
|
||||
| P1 | 应用内年龄确认 | 1-2 天 | 必须 | 待实施 |
|
||||
| P2 | 通用审计日志表 | 2 天 | 推荐 | 待实施 |
|
||||
| P3 | 泄露响应流程文档 | 1 天 | 推荐 | 待实施 |
|
||||
|
||||
### 5.2 MVP 上线前必须完成
|
||||
|
||||
1. ✅ App Store 年龄分级设置为 12+
|
||||
2. ✅ 隐私政策更新(添加儿童隐私章节)
|
||||
3. ✅ 应用内年龄确认(checkbox + 后端记录)
|
||||
|
||||
### 5.3 上线后 3 个月内完成
|
||||
|
||||
1. 通用审计日志系统
|
||||
2. 泄露响应流程文档
|
||||
|
||||
---
|
||||
|
||||
## 六、验收标准
|
||||
|
||||
### 6.1 COPPA 合规
|
||||
|
||||
- [ ] App Store 年龄分级设置为 12+(或更高)
|
||||
- [ ] 应用内注册时要求年龄确认
|
||||
- [ ] 后端记录年龄确认时间和方式
|
||||
- [ ] 隐私政策明确说明不面向 13 岁以下用户
|
||||
|
||||
### 6.2 数据安全
|
||||
|
||||
- [ ] 所有 API 强制 HTTPS(Supabase 默认)
|
||||
- [ ] SSL Labs 评级 A 或以上
|
||||
- [ ] 数据库 RLS 策略正确配置
|
||||
- [ ] 审计日志记录关键操作
|
||||
- [ ] 有书面泄露响应流程
|
||||
|
||||
---
|
||||
|
||||
## 七、关键决策记录
|
||||
|
||||
### 7.1 年龄验证方案
|
||||
|
||||
**决策**:App Store 年龄分级 + 应用内年龄声明
|
||||
|
||||
**理由**:
|
||||
1. Apple 没有直接的年龄验证 API
|
||||
2. App Store 年龄分级(12+)可阻止儿童下载(系统级保护)
|
||||
3. 应用内年龄确认作为法律合规证据
|
||||
4. 零额外成本
|
||||
|
||||
**实施方式**:
|
||||
- **主要防护**:App Store Connect 设置年龄分级为 12+
|
||||
- **辅助防护**:注册时 checkbox 确认年满 13 岁 + 后端记录
|
||||
|
||||
### 7.2 数据加密
|
||||
|
||||
**决策**:依赖 Supabase 默认加密,不额外应用层加密
|
||||
|
||||
**理由**:
|
||||
1. 当前数据类型不敏感(占卜问题、起卦数据)
|
||||
2. Supabase 已提供 TDE + HTTPS
|
||||
3. 应用层加密成本高、收益低
|
||||
|
||||
### 7.3 审计日志
|
||||
|
||||
**决策**:扩展通用审计日志表
|
||||
|
||||
**理由**:
|
||||
1. `points_audit_ledger` 只记录积分变更
|
||||
2. 需要记录用户登录、删除等操作
|
||||
3. 满足 CCPA/CPRA 审计要求
|
||||
|
||||
---
|
||||
|
||||
## 八、参考资源
|
||||
|
||||
### 8.1 法律法规
|
||||
|
||||
- [COPPA 官方指南](https://www.ftc.gov/business-guidance/privacy-security/childrens-privacy)
|
||||
- [CCPA 官方文本](https://oag.ca.gov/privacy/ccpa)
|
||||
|
||||
### 8.2 技术参考
|
||||
|
||||
- [App Store 年龄分级](https://developer.apple.com/help/app-store-connect/reference/age-ratings/)
|
||||
- [Supabase Auth 文档](https://supabase.com/docs/guides/auth)
|
||||
- [Supabase RLS 文档](https://supabase.com/docs/guides/auth/row-level-security)
|
||||
|
||||
---
|
||||
|
||||
**下一步行动**:
|
||||
1. 在 App Store Connect 设置年龄分级为 12+
|
||||
2. 更新隐私政策文档
|
||||
3. 实现应用内年龄确认(前端 checkbox + 后端记录)
|
||||
@@ -0,0 +1,500 @@
|
||||
# 美国合规法律文档讨论记录
|
||||
|
||||
**文档来源**: 飞书文档 [About us、Privacy Policy、Terms of Service](https://uidqlzahr8w.feishu.cn/wiki/As6AwJRImilu4Lk0lNtcrbmXnOc)
|
||||
|
||||
**更新日期**: 2026-04-17
|
||||
|
||||
**状态**: 待确认
|
||||
|
||||
---
|
||||
|
||||
## 一、数据收集相关
|
||||
|
||||
### 1.1 "globally" 措辞问题
|
||||
|
||||
**评论位置**: Privacy Policy - Introduction
|
||||
|
||||
**问题描述**: 文档中使用了 "globally" 措辞,可能涉及欧盟 GDPR 合规问题
|
||||
|
||||
**待确认**:
|
||||
- [ ] 是否需要同时支持 GDPR 合规?
|
||||
- [ ] 如果只针对美国市场,是否应该移除 "globally" 措辞?
|
||||
- [ ] 是否需要为欧盟用户单独准备一份 GDPR 合规的隐私政策?
|
||||
|
||||
**决策**:
|
||||
✅ 确认只针对美国市场,已移除 "globally" 措辞。欧盟暂不支持,后续如需支持将单独准备 GDPR 合规的隐私政策。
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
### 1.2 占卜数据作为敏感信息
|
||||
|
||||
**评论位置**: Privacy Policy - Information We Collect - 1.1
|
||||
|
||||
**问题描述**: 占卜输入输出被标记为 CCPA/CPRA 下的敏感个人信息(Sensitive Personal Information, SPI)
|
||||
|
||||
**待确认**:
|
||||
- [ ] 占卜数据归类为 SPI 是否正确?
|
||||
- [ ] 归类为 SPI 有什么风险和合规要求?
|
||||
- [ ] 是否需要在用户使用前明确告知并获取同意?
|
||||
- [ ] SPI 数据的处理、存储、删除是否有特殊要求?
|
||||
|
||||
**决策**:
|
||||
✅ 占卜数据理论上符合 CCPA/CPRA 中"哲学信念或思想活动"的 SPI 定义,但从合规和实用角度,**不建议将其标记为 SPI**。
|
||||
- 占卜属于娱乐性质,不涉及健康、金融等专业领域
|
||||
- 标记为 SPI 会增加用户限制使用 SPI 数据的权利请求,增加合规负担
|
||||
- 行业主流做法(如 ChatGPT、Character AI)不将此类内容标记为 SPI
|
||||
|
||||
**已更新**: 从所有语言版本的隐私政策中移除对占卜数据作为 SPI 的标记。
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
### 1.3 数据收集范围完整性
|
||||
|
||||
**评论位置**: Privacy Policy - Information We Collect
|
||||
|
||||
**问题描述**: 需要确认文档中列出的数据收集范围是否完整
|
||||
|
||||
**待确认**:
|
||||
- [ ] 账户信息:邮箱、验证码 - 是否完整?
|
||||
- [ ] 设备标识符:IDFA、AAID、UDID、MAC 地址 - 是否都有收集?
|
||||
- [ ] 技术数据:IP、时间戳、崩溃日志 - 是否完整?
|
||||
- [ ] 使用数据:功能访问、占卜频率、会话时长 - 是否有收集?
|
||||
- [ ] 是否还有其他收集的数据未列出?
|
||||
|
||||
**决策**:
|
||||
✅ 根据代码分析和规划,已更新数据收集范围:
|
||||
|
||||
**目前已收集**:
|
||||
- 账户信息:邮箱、验证码、refresh_token
|
||||
- 占卜数据:问题、起卦数据(YaoType 数组)、device_timezone
|
||||
- 设备信息:设备型号、OS 版本
|
||||
- 技术数据:访问时间戳、会话历史
|
||||
- **使用数据**:占卜频率、会话时长(后端采集)
|
||||
|
||||
**未来将接入(已保留在文档中)**:
|
||||
- ✅ AppsFlyer(归因和营销分析)
|
||||
- ✅ SKAdNetwork(苹果归因)
|
||||
|
||||
**未收集且暂无计划(已从文档移除)**:
|
||||
- ❌ 设备标识符:IDFA、AAID、UDID、MAC 地址(会通过 AppsFlyer 间接收集)
|
||||
- ❌ 技术数据:IP 地址、崩溃日志
|
||||
- ❌ Analytics:Firebase Analytics、Google Analytics
|
||||
- ❌ 崩溃报告:Crashlytics
|
||||
- ❌ 推送通知:FCM、APNs(目前不使用推送)
|
||||
|
||||
**已更新**: 保留未来会接入的 SDK 和功能,移除目前没有且暂无计划的服务。
|
||||
|
||||
**负责人**: 志良
|
||||
|
||||
---
|
||||
|
||||
## 二、数据存储与跨境传输
|
||||
|
||||
### 2.1 云服务商与服务器位置
|
||||
|
||||
**评论位置**: Privacy Policy - Data Storage, Retention & Cross-Border Transfers - 3.1
|
||||
|
||||
**问题描述**: 需要确认实际使用的云服务商和服务器位置
|
||||
|
||||
**待确认**:
|
||||
- [ ] 实际使用什么云服务商?(AWS / 阿里云 / 其他)
|
||||
- [ ] 服务器是否在美国?
|
||||
- [ ] 是否有数据传输到中国?
|
||||
- [ ] 管理员从中国访问美国服务器上的数据,是否算跨境传输?
|
||||
- [ ] 如果使用阿里云,在美国应用商店是否会被歧视?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**: 志良
|
||||
|
||||
---
|
||||
|
||||
### 2.2 跨境传输安全
|
||||
|
||||
**评论位置**: Privacy Policy - Data Storage, Retention & Cross-Border Transfers
|
||||
|
||||
**问题描述**: 如何解决跨境传输安全问题
|
||||
|
||||
**待确认**:
|
||||
- [ ] 是否存在跨境传输场景?
|
||||
- [ ] 如果存在,使用什么加密协议?(文档声称 AES-256 + TLS 1.3)
|
||||
- [ ] 是否符合美国数据保护法律要求?
|
||||
- [ ] 是否需要在美国隐私政策中披露跨境传输?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
## 三、数据保留策略
|
||||
|
||||
### 3.1 账户删除后 90 天留存
|
||||
|
||||
**评论位置**: Privacy Policy - Data Storage, Retention & Cross-Border Transfers - 3.2
|
||||
|
||||
**问题描述**: 账户删除后数据保留 90 天是否合规
|
||||
|
||||
**待确认**:
|
||||
- [ ] CCPA/CPRA 对删除后留存时间的要求是什么?
|
||||
- [ ] 90 天留存是否符合法律要求?
|
||||
- [ ] 留存 90 天的目的是什么?(法律义务?安全审计?)
|
||||
- [ ] 是否应该改为立即删除或更短时间?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
### 3.2 占卜记录 12 个月留存
|
||||
|
||||
**评论位置**: Privacy Policy - Data Storage, Retention & Cross-Border Transfers - 3.2
|
||||
|
||||
**问题描述**: 占卜记录保留 12 个月,然后删除或匿名化
|
||||
|
||||
**待确认**:
|
||||
- [ ] 12 个月留存期的法律依据是什么?
|
||||
- [ ] 如何实现匿名化?具体方案?
|
||||
- [ ] 用户主动删除数据时,是否立即删除还是仍保留 12 个月?
|
||||
- [ ] 匿名化后的数据用途是什么?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
## 四、第三方服务商
|
||||
|
||||
### 4.1 分析工具清单
|
||||
|
||||
**评论位置**: Privacy Policy - Sharing & Disclosure of Information - 4.2
|
||||
|
||||
**问题描述**: 需要补充实际使用的分析工具
|
||||
|
||||
**待确认**:
|
||||
- [ ] 当前使用了哪些分析工具?
|
||||
- [ ] AppsFlyer(已添加到文档)
|
||||
- [ ] SKAdNetwork(已添加到文档)
|
||||
- [ ] Firebase Analytics
|
||||
- [ ] Google Analytics
|
||||
- [ ] 其他:______
|
||||
- [ ] 这些工具是否都在隐私政策中列出?
|
||||
- [ ] 每个工具收集什么数据?
|
||||
- [ ] 是否需要用户同意?
|
||||
|
||||
**决策**:
|
||||
✅ 已在文档中添加未来将接入的 AppsFlyer 和 SKAdNetwork。
|
||||
|
||||
**待确认**:
|
||||
- AppsFlyer 和 SKAdNetwork 的具体数据收集范围
|
||||
- 用户是否需要通过 App Store/Google Play 同意
|
||||
- 是否需要在文档中更详细描述这两个 SDK 收集的数据
|
||||
|
||||
**负责人**: 志良
|
||||
|
||||
---
|
||||
|
||||
### 4.2 推送服务与数据类型
|
||||
|
||||
**评论位置**: Privacy Policy - Sharing & Disclosure of Information - 4.2
|
||||
|
||||
**问题描述**: 需要确认推送服务的类型和数据
|
||||
|
||||
**待确认**:
|
||||
- [ ] 使用什么推送服务?
|
||||
- [ ] Firebase Cloud Messaging (FCM)
|
||||
- [ ] Apple Push Notification Service (APNs)
|
||||
- [ ] 其他:______
|
||||
- [ ] 推送哪些类型的通知?
|
||||
- [ ] 占卜结果提醒
|
||||
- [ ] 系统通知
|
||||
- [ ] 营销通知
|
||||
- [ ] 其他:______
|
||||
- [ ] 推送数据是否包含个人信息?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**: 志良
|
||||
|
||||
---
|
||||
|
||||
## 五、用户权利实现
|
||||
|
||||
### 5.1 数据删除功能
|
||||
|
||||
**评论位置**: Privacy Policy - Your U.S. Privacy Rights
|
||||
|
||||
**问题描述**: 是否已实现数据删除功能
|
||||
|
||||
**待确认**:
|
||||
- [ ] App 内是否有账户删除/数据删除按钮?
|
||||
- [ ] 删除流程是什么?
|
||||
- [ ] 立即删除
|
||||
- [ ] 冷却期后删除
|
||||
- [ ] 标记删除但保留数据
|
||||
- [ ] 删除后数据是直接清空还是标记删除?
|
||||
- [ ] 删除后哪些数据会保留?(交易记录、日志等)
|
||||
- [ ] 是否符合 CCPA 45 天内删除的要求?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**: 志良
|
||||
|
||||
---
|
||||
|
||||
### 5.2 "Do Not Sell My Personal Information" 实现
|
||||
|
||||
**评论位置**: Privacy Policy - Your U.S. Privacy Rights
|
||||
|
||||
**问题描述**: 是否需要在隐私政策页实现 "Do Not Sell" 按钮
|
||||
|
||||
**待确认**:
|
||||
- [ ] 是否需要在隐私政策页添加 "Do Not Sell My Personal Information" 按钮?
|
||||
- [ ] 按钮形式:
|
||||
- [ ] 勾选框(默认勾选/不勾选?)
|
||||
- [ ] 开关按钮
|
||||
- [ ] 是否需要在设置-隐私中也添加此选项?
|
||||
- [ ] 用户选择后如何处理?
|
||||
- [ ] 既然文档声明 "WE DO NOT SELL",是否还需要此按钮?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
### 5.3 App 内数据请求路径
|
||||
|
||||
**评论位置**: Privacy Policy - Your U.S. Privacy Rights - How to Exercise Your Rights
|
||||
|
||||
**问题描述**: 确认是否有 Settings → Privacy → Data Requests 路径
|
||||
|
||||
**待确认**:
|
||||
- [ ] 当前 App 是否有此路径?
|
||||
- [ ] 如果没有,是否需要实现?
|
||||
- [ ] Data Requests 页面应包含哪些功能?
|
||||
- [ ] 数据访问请求
|
||||
- [ ] 数据删除请求
|
||||
- [ ] 数据导出请求
|
||||
- [ ] Do Not Sell 设置
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
## 六、联系方式
|
||||
|
||||
### 6.1 隐私专用邮箱
|
||||
|
||||
**评论位置**: Privacy Policy - Your U.S. Privacy Rights - How to Exercise Your Rights
|
||||
|
||||
**问题描述**: 需要创建觅爻专用的隐私邮箱
|
||||
|
||||
**待确认**:
|
||||
- [ ] 是否需要创建 privacy@xunmee.com 或类似邮箱?
|
||||
- [ ] 邮箱命名方案:
|
||||
- [ ] privacy@xunmee.com
|
||||
- [ ] privacy@meiyao.com
|
||||
- [ ] 其他:______
|
||||
- [ ] 谁负责处理隐私相关邮件?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
### 6.2 物理地址
|
||||
|
||||
**评论位置**: Privacy Policy - Your U.S. Privacy Rights - How to Exercise Your Rights
|
||||
|
||||
**问题描述**: 是否必须提供物理地址
|
||||
|
||||
**待确认**:
|
||||
- [ ] CCPA 是否要求提供物理地址?
|
||||
- [ ] 如果必须,使用什么地址?
|
||||
- [ ] 公司注册地址
|
||||
- [ ] 办公地址
|
||||
- [ ] 其他:______
|
||||
- [ ] 地址信息:______
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
### 6.3 联系邮箱确认
|
||||
|
||||
**评论位置**: Privacy Policy - Contact Us & Complaints
|
||||
|
||||
**问题描述**: 确认并更新联系邮箱
|
||||
|
||||
**待确认**:
|
||||
- [ ] Privacy Officer Email: privacy@xunmee.com - 是否正确?
|
||||
- [ ] Support Email: xuyunlong@xunmee.com - 是否正确?
|
||||
- [ ] 是否需要更新?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
## 七、儿童保护(COPPA)
|
||||
|
||||
### 7.1 年龄验证机制
|
||||
|
||||
**评论位置**: Privacy Policy - Children's Privacy (COPPA Compliance)
|
||||
|
||||
**问题描述**: 如何验证用户年龄,防止 13 岁以下儿童使用
|
||||
|
||||
**待确认**:
|
||||
- [ ] 是否需要年龄验证机制?
|
||||
- [ ] 验证方案:
|
||||
- [ ] 注册时声明年龄
|
||||
- [ ] App Store/Google Play 年龄 API
|
||||
- [ ] 其他:______
|
||||
- [ ] 参考其他 App 的做法:
|
||||
- [ ] TikTok、YouTube 等如何处理?
|
||||
- [ ] 如果发现 13 岁以下用户,如何处理?
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
## 八、数据安全措施
|
||||
|
||||
### 8.1 安全措施确认
|
||||
|
||||
**评论位置**: Privacy Policy - Data Security
|
||||
|
||||
**问题描述**: 确认文档中声明的安全措施是否真实实施
|
||||
|
||||
**待确认**:
|
||||
- [ ] 加密措施:
|
||||
- [ ] AES-256 数据加密
|
||||
- [ ] TLS 1.3 传输加密
|
||||
- [ ] 访问控制:
|
||||
- [ ] 基于角色的访问控制
|
||||
- [ ] 多因素认证(MFA)
|
||||
- [ ] 监控审计:
|
||||
- [ ] 24/7 安全监控
|
||||
- [ ] 定期渗透测试
|
||||
- [ ] 审计日志
|
||||
- [ ] 泄露响应:
|
||||
- [ ] 72 小时内通知机制
|
||||
- [ ] 响应流程
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**: 志良
|
||||
|
||||
---
|
||||
|
||||
## 九、其他待确认事项
|
||||
|
||||
### 9.1 App Store 合规要求
|
||||
|
||||
**评论位置**: Privacy Policy - Next Steps for U.S. App Store Compliance
|
||||
|
||||
**待确认**:
|
||||
- [ ] 隐私政策链接已添加到 App Store Connect?
|
||||
- [ ] 隐私政策链接已添加到 Google Play Console?
|
||||
- [ ] App 内隐私政策链接是否可用?
|
||||
- [ ] "Do Not Sell My Personal Information" 链接是否已实现?
|
||||
- [ ] App Store Privacy Details 是否已填写?
|
||||
- [ ] Google Play Data Safety Form 是否已填写?
|
||||
- [ ] iOS ATT (App Tracking Transparency) 权限提示是否已实现?
|
||||
- [ ] App 内账户删除功能是否已实现?(Apple 要求)
|
||||
|
||||
**决策**:
|
||||
|
||||
**负责人**:
|
||||
|
||||
---
|
||||
|
||||
## 讨论记录
|
||||
|
||||
### 会议/讨论 1
|
||||
|
||||
**日期**:
|
||||
|
||||
**参与人**:
|
||||
|
||||
**讨论内容**:
|
||||
|
||||
**决策结论**:
|
||||
|
||||
---
|
||||
|
||||
### 会议/讨论 2
|
||||
|
||||
**日期**:
|
||||
|
||||
**参与人**:
|
||||
|
||||
**讨论内容**:
|
||||
|
||||
**决策结论**:
|
||||
|
||||
---
|
||||
|
||||
## 更新记录
|
||||
|
||||
### 2026-04-17: 英文隐私政策按CCPA/CPRA标准重写
|
||||
|
||||
**更新内容**:
|
||||
|
||||
1. **按照CCPA/CPRA标准规范重新编写英文隐私政策**
|
||||
|
||||
标准格式包括:
|
||||
- Who We Are - 公司信息和联系方式
|
||||
- Information We Collect - 详细列出收集的信息类别
|
||||
- Categories of Personal Information - 按照CCPA要求的表格格式列出A-K类别
|
||||
- How We Use Your Personal Information - 使用目的
|
||||
- How We Share Your Personal Information - 共享情况,包括服务提供商表格
|
||||
- Your Privacy Rights (California Residents) - 加州居民权利
|
||||
- How to Exercise Your Rights - 如何行使权利
|
||||
- Data Retention - 数据保留政策
|
||||
- Data Security - 安全措施
|
||||
- Children's Privacy - 儿童隐私保护(COPPA)
|
||||
- Cross-Border Data Transfers - 跨境传输
|
||||
- Changes to This Privacy Policy - 政策变更
|
||||
- Contact Us - 联系方式
|
||||
- Additional Rights for California Residents - 加州居民额外权利
|
||||
|
||||
2. **关键更新**:
|
||||
- ✅ 移除占卜数据作为 SPI 的标记
|
||||
- ✅ 添加 AppsFlyer 和 SKAdNetwork 归因工具
|
||||
- ✅ 添加会话时长和占卜频率收集说明
|
||||
- ✅ 明确声明不销售个人数据
|
||||
- ✅ 按CCPA要求提供数据类别表格(A-K)
|
||||
- ✅ 提供行使权利的具体方式(邮箱 + 应用内)
|
||||
|
||||
3. **简体中文和繁体中文**:
|
||||
- 已清空并标记等待英文正式稿确认后翻译
|
||||
- 将保持与英文版本结构一致
|
||||
|
||||
4. **About Us 更新**:
|
||||
- 更新隐私政策链接说明
|
||||
|
||||
**待确认**:
|
||||
- [ ] 隐私邮箱 privacy@xunmee.com 是否已创建
|
||||
- [ ] 公司完整地址是否需要提供
|
||||
- [ ] App 内是否有 Settings → Privacy → Data Requests 路径
|
||||
- [ ] 是否需要实现 "Do Not Sell My Personal Information" 页面(虽然我们不销售数据)
|
||||
- [ ] AppsFlyer 和 SKAdNetwork 具体数据收集范围需要确认
|
||||
- [ ] 确认数据保留政策是否合理(账户90天,占卜记录12个月)
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user