Skip to content

Commit eaa9d2d

Browse files
authored
Merge pull request #63 from AptS-1547/develop
Develop & Release 0.4.1
2 parents ff75c21 + af4add4 commit eaa9d2d

69 files changed

Lines changed: 6415 additions & 703 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/rust.yml

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,63 @@ env:
1919

2020
jobs:
2121
build:
22-
2322
runs-on: ubuntu-latest
2423

2524
steps:
2625
- uses: actions/checkout@v4
26+
27+
- name: Setup Rust toolchain
28+
uses: dtolnay/rust-toolchain@stable
29+
30+
- name: Cache cargo registry
31+
uses: actions/cache@v4
32+
with:
33+
path: |
34+
~/.cargo/registry
35+
~/.cargo/git
36+
target
37+
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
38+
restore-keys: |
39+
${{ runner.os }}-cargo-
40+
2741
- name: Build
2842
run: cargo build --verbose
43+
2944
- name: Run tests
3045
run: cargo test --verbose
46+
47+
coverage:
48+
runs-on: ubuntu-latest
49+
needs: build
50+
51+
steps:
52+
- uses: actions/checkout@v4
53+
54+
- name: Setup Rust toolchain
55+
uses: dtolnay/rust-toolchain@stable
56+
57+
- name: Cache cargo registry
58+
uses: actions/cache@v4
59+
with:
60+
path: |
61+
~/.cargo/registry
62+
~/.cargo/git
63+
target
64+
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
65+
restore-keys: |
66+
${{ runner.os }}-cargo-
67+
68+
- name: Install cargo-tarpaulin
69+
run: cargo install cargo-tarpaulin
70+
71+
- name: Generate coverage report
72+
run: cargo tarpaulin --out Xml --output-dir coverage
73+
74+
- name: Upload coverage to Codecov
75+
uses: codecov/codecov-action@v4
76+
with:
77+
files: coverage/cobertura.xml
78+
fail_ci_if_error: false
79+
verbose: true
80+
env:
81+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ links.db*
3131
links.json
3232
shortlinker.pid
3333
cargo-flamegraph.trace/
34-
flamegraph.svg
34+
flamegraph.svg
35+
coverage/

CHANGELOG.md

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,85 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [v0.4.1] - 2026-02-01
9+
10+
### 🎉 Release Highlights
11+
12+
v0.4.1 是一次重要的安全与性能优化版本,主要亮点:
13+
14+
- **CSRF 防护** - 双令牌模式的 CSRF 中间件,防止跨站请求伪造攻击
15+
- **流式 CSV 导出** - 支持大规模数据导出,内存占用从 O(N) 降至 O(batch_size)
16+
- **登录限流安全增强** - 可信代理配置,防止 IP 伪造绕过限流
17+
- **CSV 导入性能优化** - Bloom Filter 预筛选 + 批量查询,显著提升冲突检测性能
18+
- **全面的测试覆盖** - 新增 8 个基准测试和覆盖 22 个模块的单元测试
19+
20+
### Added
21+
- **CSRF 防护中间件** - 双令牌模式,验证 `X-CSRF-Token` header 与 Cookie 匹配
22+
- 使用 `subtle::ConstantTimeEq` 进行常量时间比较,防止时序攻击
23+
- 安全方法(GET/HEAD/OPTIONS)和 Bearer Token 认证自动跳过
24+
- 认证端点(login/refresh/logout)自动跳过 CSRF 验证
25+
- **流式 CSV 导出** - 分批次流式导出(每批 10,000 条),支持 `Transfer-Encoding: chunked`
26+
- 使用 `spawn_blocking` 将 CSV 序列化移到独立线程池,避免阻塞 worker 线程
27+
- 内存占用优化:导出 100 万条链接内存占用从 O(N) 降至 O(1000)
28+
- **可信代理配置** - 新增 `api.trusted_proxies` 配置项(支持 IP 和 CIDR 格式)
29+
- 登录限流 key 优先使用连接 IP(不可伪造),仅可信代理时使用 `X-Forwarded-For`
30+
- 支持 IPv4/IPv6 CIDR 匹配(如 `192.168.1.0/24`
31+
- **批量短码存在性检查 API** - `batch_check_codes_exist()` 方法,支持分批查询(每批 500 个)
32+
- **API 常量模块** - 硬编码 Cookie 名称(`shortlinker_access`, `shortlinker_refresh`, `csrf_token`
33+
- **全面的基准测试套件** - 新增 8 个基准测试,覆盖缓存、IPC、密码哈希等关键路径
34+
- `cache_layer`: CompositeCache 各操作性能
35+
- `import_conflict`: CSV 导入冲突检测策略对比
36+
- `ipc_protocol`: IPC 协议序列化/反序列化性能
37+
- `password`: Argon2 密码哈希性能
38+
- `utils`: 短码生成、URL 验证等工具函数性能
39+
- **单元测试覆盖** - 新增测试覆盖 22 个模块(JWT、缓存层、存储层、服务层、错误处理等)
40+
- **集成测试套件** - 新增 `link_service_tests.rs`(865 行)和 `storage_tests.rs`(695 行)
41+
42+
### Changed
43+
- **Cookie 安全标志默认开启** - `cookie_secure` 默认改为 `true`,强制 HTTPS 传输 Cookie
44+
- `cookie_secure=false` 时启动输出警告日志
45+
- **移除可配置 Cookie 名称** - 移除 `access_cookie_name``refresh_cookie_name` 配置项
46+
- 改为硬编码常量,减少攻击面
47+
- **升级依赖** - Rust 1.93-slim,移除 OpenSSL 依赖(使用 rustls)
48+
49+
### Improved
50+
- **CSV 导入冲突检测性能优化** - 全量加载 -> Bloom Filter 预筛选 -> 批量查询
51+
- 预扫描 CSV 提取所有 codes,使用 Bloom Filter 快速排除肯定不存在的 codes
52+
- 仅对可能存在的 codes 执行批量数据库查询
53+
- **CSV 导出流式化** - 使用 `stream::unfold` 实现分页流式查询(每批 1000 条)
54+
- **Dockerfile 构建优化** - 减少镜像层大小,静态链接编译,移除未使用的依赖
55+
- **查询条件构建** - 使用 SeaORM `contains()` 方法替代手动字符串拼接,防止通配符注入
56+
- **基准测试性能** - 手动创建运行时,避免每次迭代创建/销毁
57+
58+
### Fixed
59+
- **健康检查未授权响应** - 统一业务码为 1(之前为 401),保持 API 响应格式一致性
60+
- **Symlink 攻击防护** - 使用 `create_new()` 原子创建 `admin_token.txt`,防止 TOCTOU 竞态条件
61+
- **SeaORM contains() 误用** - 移除手动添加 `%` 通配符,`contains()` 方法已自动处理
62+
63+
### Security
64+
- **IPC 权限控制** - Unix socket 文件创建后设置权限为 `0600`(仅属主可读写)
65+
- **Admin Token 文件安全** - 原子创建文件 + Unix 权限 0600,防止 symlink 攻击
66+
- **登录限流增强** - 默认使用连接 IP(不可伪造),防止客户端伪造 IP 绕过限流
67+
- **CSRF Cookie SameSite 设置** - CSRF Cookie 使用 `Lax` 模式,防止跨站 POST 请求
68+
- **认证方式显式标记** - 在 `req.extensions()` 中插入 `AuthMethod`,CSRF 中间件根据标记判断是否跳过验证
69+
70+
### Dependencies
71+
- 升级 Rust 至 1.93-slim
72+
- 移除 OpenSSL 依赖(使用 rustls)
73+
74+
### Docs
75+
- 更新 Admin API 鉴权文档,新增 CSRF 防护说明
76+
- 更新配置文档,新增 `api.trusted_proxies` 说明
77+
78+
### Migration Notes
79+
80+
**⚠️ 从 v0.4.0 升级注意事项:**
81+
82+
1. **CSRF 防护默认启用** - Web 管理面板的所有变更操作需携带 `X-CSRF-Token` header
83+
2. **Cookie 名称硬编码** - `access_cookie_name``refresh_cookie_name` 配置项已移除,现在固定为 `shortlinker_access``shortlinker_refresh`
84+
3. **Cookie Secure 默认开启** - 如需在非 HTTPS 环境使用,需显式设置 `cookie_secure=false`(启动时会有警告)
85+
4. **可信代理配置** - 如果在代理/负载均衡器后部署,建议配置 `api.trusted_proxies` 列表以正确识别客户端 IP
86+
887
## [v0.4.0] - 2026-01-23
988

1089
### 🎉 Release Highlights
@@ -908,7 +987,8 @@ v0.3.0 是一个重大版本更新,包含大量安全增强、性能优化和
908987
- Update README.md
909988
- Initial commit
910989

911-
[Unreleased]: https://github.com/AptS-1547/shortlinker/compare/v0.4.0...HEAD
990+
[Unreleased]: https://github.com/AptS-1547/shortlinker/compare/v0.4.1...HEAD
991+
[v0.4.1]: https://github.com/AptS-1547/shortlinker/compare/v0.4.0...v0.4.1
912992
[v0.4.0]: https://github.com/AptS-1547/shortlinker/compare/v0.3.0...v0.4.0
913993
[v0.3.0]: https://github.com/AptS-1547/shortlinker/compare/v0.2.2...v0.3.0
914994
[v0.3.0-beta.3]: https://github.com/AptS-1547/shortlinker/compare/v0.3.0-beta.2...v0.3.0-beta.3

0 commit comments

Comments
 (0)