SkyMap 包含多层安全防护机制,旨在保护用户数据并防止恶意滥用。
后端实现了一个基于滑动窗口算法的速率限制器,防止命令滥用和拒绝服务 (DoS) 攻击。
根据命令的敏感程度和预期使用频率,分为四个限制级别:
| 级别 | 请求/分钟 | 适用场景 | 超限封禁 |
|---|---|---|---|
| 保守级别 | 10 | 敏感操作(文件访问、数据导入导出) | 是 (5分钟) |
| 中等级别 | 100 | 常规操作(CRUD、缓存操作) | 否 |
| 宽松级别 | 1000 | 缓存预取、瓦片加载 | 否 |
| 只读级别 | 10000 | 读取查询(获取、列表、统计) | 否 |
- 保守级别:
open_path,reveal_in_file_manager,import_all_data,export_all_data - 中等级别:
save_store_data,load_store_data,save_cached_tile,import_targets - 宽松级别:
prefetch_url,load_cached_tile - 只读级别:
list_stores,get_storage_stats
对于"保守级别"的命令,如果用户持续触发限制,系统会自动实施临时封禁(5分钟)。
后端在处理数据前会执行严格的验证,防止各类攻击。
防止内存和磁盘耗尽攻击:
| 输入类型 | 最大大小 | 验证位置 |
|---|---|---|
| JSON 存储 | 10 MB | data/storage.rs |
| 星图瓦片 | 5 MB | cache/offline.rs |
| CSV 导入 | 50 MB + 100,000 行 | data/target_io.rs |
| URL 长度 | 2048 字符 | network/security.rs |
防止服务端请求伪造 (SSRF) 攻击:
| 规则 | 说明 |
|---|---|
| 禁止私有 IP | 阻止 192.168.x.x, 10.x.x.x, 172.16-31.x.x, 169.254.x.x |
| 禁止本地回环 | 阻止 localhost, 127.x.x.x, ::1 |
| HTTPS 强制 | 默认仅允许 HTTPS 协议 |
| 危险协议拦截 | 阻止 file://, data://, javascript://, ftp:// |
| 域名白名单 | 可选的域名白名单支持 |
存储模块仅允许访问应用程序专用的数据目录,防止路径穿越攻击:
- 所有文件操作限制在应用数据目录内
- 路径验证阻止
../等遍历尝试
所有写入的数据在保存前都会进行反序列化校验,确保数据完整性。
src-tauri/src/network/
├── security.rs # 核心安全工具(URL 验证、大小验证)
└── rate_limiter.rs # 速率限制器实现(含测试套件)
lib/security/
└── url-validator.ts # TypeScript URL 验证工具
| 攻击场景 | 防护状态 | 残余风险 |
|---|---|---|
| SSRF 攻击 | 已阻止 | 无 |
| 资源耗尽 (DoS) | 已缓解 | 低 |
| API 滥用 | 已缓解 | 中 |
| 大型文件攻击 | 已阻止 | 无 |
| 攻击类型 | 修复前 | 修复后 |
|---|---|---|
| SSRF via URL 注入 | 简单 | 不可能 |
| 超大 JSON 反序列化 | 简单 | 已阻止 |
| 缓存泛洪 | 简单 | 中等 |
| 大量 CSV 导入 | 简单 | 已阻止 |
| API 滥用 | 简单 | 中等 |
项目配置了完整的安全测试套件,验证各安全机制的正确性:
# 运行所有安全测试
cd src-tauri
cargo test network::security::tests
cargo test network::rate_limiter::tests
# 运行特定测试
cargo test test_validate_url_blocks_localhost
cargo test test_validate_size
cargo test test_rate_limit_within_window
# 查看测试输出
cargo test network:: -- --nocapture- URL 验证(localhost、私有 IP、危险协议、白名单)
- 大小限制(JSON、CSV、瓦片)
- 速率限制(窗口过期、封禁行为、命令级限制)
- 集成测试(纵深防御)
编辑 src-tauri/src/network/security.rs:
pub mod limits {
pub const MAX_JSON_SIZE: usize = 10 * 1024 * 1024; // 10 MB
pub const MAX_CSV_SIZE: usize = 50 * 1024 * 1024; // 50 MB
pub const MAX_TILE_SIZE: usize = 5 * 1024 * 1024; // 5 MB
pub const MAX_CSV_ROWS: usize = 100_000; // 10万行
}编辑 src-tauri/src/network/rate_limiter.rs 中的 get_command_rate_limit() 函数。
// 后端
let allowlist = vec!["api.trusted.com", "cdn.trusted.com"];
let validated_url = validate_url(&url, false, Some(&allowlist))?;
// 前端
validateUrl(url, {
allowHttp: false,
allowlist: ['api.trusted.com', 'cdn.trusted.com']
});安全措施的性能开销极低:
| 检查类型 | 开销 | 影响评估 |
|---|---|---|
| URL 验证 | ~0.1ms | 可忽略(相比网络延迟) |
| 大小验证 | ~0.001ms | O(1) 操作 |
| 速率限制检查 | ~0.05ms | 可忽略 |
总开销: 每个受保护操作 <1ms
-
认证与授权层
- 实现用户认证
- 为所有 Tauri 命令添加权限检查
- 基于角色的访问控制
-
数据加密
- 加密静态敏感数据
- 使用系统凭证存储
- 实现密钥管理
-
审计日志
- 记录所有安全相关操作
- 实现防篡改日志
- 可疑活动告警
-
CSP 实现
- 实现严格的内容安全策略
- 添加 CSP 报告模式用于测试