VUL-003 (中): X-Forwarded-For 信任链可被伪造 IP 绕过限流
本服务定位为公网入口,即使单人使用,公网暴露意味着攻击面
与公开服务等同,不能"够用就行"。
采用渐进式披露设计,平衡易用性与功能性:
1. 启发式模式(默认, 不设环境变量 或 TRUSTED_PROXY_HOPS=0)
- 从 XFF 链尾扫描,跳过私有 IP,返回第一个公网 IP
- 适合 90% 部署(单跳/多跳/直出),无需了解精确跳数
- 限制:多跳 CDN 场景下,限流粒度为"按 CDN 边缘 IP"
- 直出部署:整个 XFF 分支不会执行
2. 精确模式(TRUSTED_PROXY_HOPS=N, N>0)
- 从 XFF 链尾倒数第 N+1 个位置取值
- 精准到真实 client,需按实际反代跳数正确配置
- N=1:单跳反代;N=2:CDN+反代;以此类推
3. 两种模式都从链尾扫描
- XFF 首值是客户端可控的,信任首值等于信任攻击者
- 链尾由受控的反代添加,天然免疫伪造绕过
4. 默认值从 1 改为 0(行为变化)
- 旧默认:精确模式 N=1,取 XFF 末值
- 新默认:启发式模式,跳过链尾私有 IP
- 对单跳场景行为相同
- 对多跳/链尾含私有 IP 场景新版更准确(返回真实公网 IP)
5. 配套
- middleware/ratelimit_test.go:24 个表驱动测试用例,
覆盖直出/单跳/多跳/伪造/畸形/精确 N 边界,全部通过
- setting/config.go:LogStartupSummary 显示当前 XFF 模式
- .env.example:重写说明,标注默认行为 + 何时需配
- README.md:新增"反代拓扑与 X-Forwarded-For 解析"章节
(何时需要/两种模式/行为对比/为什么从链尾/启动日志验证)
6. 已知边界:TRUSTED_PROXY_HOPS=00 等被 Atoi 解析为 0 的
输入归入启发式模式,日志不会出现"精确模式 0 跳"矛盾输出。
70 lines
2.5 KiB
Bash
70 lines
2.5 KiB
Bash
# 字节火山引擎 TTS v3 API 配置示例
|
|
# 将此文件复制为 .env 并填入实际配置
|
|
|
|
# ==========================================
|
|
# 必需的环境变量
|
|
# ==========================================
|
|
|
|
# 火山引擎新版控制台获取的 API Key
|
|
BYTEDANCE_TTS_API_KEY=your_api_key_here
|
|
|
|
# 资源信息ID(决定使用1.0还是2.0模型)
|
|
# 复刻 2.0 音色(seed-icl-2.0)
|
|
BYTEDANCE_TTS_RESOURCE_ID=seed-icl-2.0
|
|
|
|
# 发音人(音色)ID
|
|
BYTEDANCE_TTS_SPEAKER=your_speaker_id_here
|
|
|
|
# ==========================================
|
|
# 可选的环境变量
|
|
# ==========================================
|
|
|
|
# 单次合成超时,默认30s
|
|
BYTEDANCE_TTS_TIMEOUT=30s
|
|
|
|
# 上游实际请求的音频格式:mp3 / pcm / ogg_opus
|
|
# 客户端要求 wav 时,内部自动转 pcm 上游 + 本地拼 WAV 头
|
|
BYTEDANCE_TTS_FORMAT=mp3
|
|
|
|
# 上游采样率:8000/16000/22050/24000/32000/44100/48000
|
|
BYTEDANCE_TTS_SAMPLE_RATE=24000
|
|
|
|
# MP3 比特率(可选),仅 MP3 生效
|
|
# BYTEDANCE_TTS_BIT_RATE=128000
|
|
|
|
# 复刻 2.0 子模型(可选),留空则使用控制台默认值
|
|
# seed-tts-2.0-standard:标准版,延时更优
|
|
# seed-tts-2.0-expressive:表现力增强版,支持 QA / Cot
|
|
# BYTEDANCE_TTS_MODEL=seed-tts-2.0-standard
|
|
|
|
# 复刻 2.0 模型类型(可选,推荐显式指定)
|
|
# 4 = ICL V2,5 = ICL V3
|
|
# BYTEDANCE_TTS_MODEL_TYPE=4
|
|
|
|
# 非中文/英文合成时指定语种(可选)
|
|
# zh-cn / en / ja / es-mx / id / pt-br / ko
|
|
# BYTEDANCE_TTS_EXPLICIT_LANGUAGE=zh-cn
|
|
|
|
# 复刻 2.0 启用字级时间戳(可选)
|
|
# BYTEDANCE_TTS_ENABLE_SUBTITLE=false
|
|
|
|
# OpenAI兼容接口的API密钥(可选,多个用逗号分隔)
|
|
OPENAI_TTS_API_KEY=your_openai_compatible_key_here
|
|
|
|
# 反代拓扑配置(0-10)。控制 X-Forwarded-For 解析方式,影响 IP 限流的 key。
|
|
# 不设置 / 0:启发式模式(默认)—— 从 XFF 链尾扫描,跳过私有 IP,返回第一个公网 IP
|
|
# 适合 90% 部署(单跳/多跳/直出),无需了解精确跳数
|
|
# N (N>0) :精确模式 —— 精准到真实 client IP,需要正确配置跳数
|
|
# N=1:单跳反代(client → nginx → 本服务)
|
|
# N=2:双跳反代(client → CDN → nginx → 本服务,如 Cloudflare + nginx)
|
|
# N=3:三跳,以此类推
|
|
# 直出部署(无反代):无需配置,XFF 分支不会执行
|
|
# 详见 README "反代拓扑与 X-Forwarded-For 解析"章节
|
|
# TRUSTED_PROXY_HOPS=
|
|
|
|
# CORS 跨域白名单(逗号分隔;开发环境可设 *;空则拒绝所有跨域)
|
|
# ALLOWED_ORIGINS=https://example.com,https://app.example.com
|
|
|
|
# 服务监听端口,默认8080
|
|
PORT=8080
|