TVBox的JSON接口默认无鉴权,可能被他人滥用。现已添加多种可选的安全机制。
所有安全配置都可以在 管理后台 > TVBox安全配置 页面中进行设置,无需修改环境变量或配置文件。
所有用户共享同一个 token:
配置步骤:
- 管理后台 > TVBox安全配置
- 启用 "Token验证"
- 系统自动生成token(可手动修改)
- 保存配置
使用:
https://your-domain.com/api/tvbox?token=你的token
特性:
- 🎯 每个用户独立 token + 源权限
- 🔒 token 泄露只影响单个用户
- 📊 可追踪用户访问
- 🔄 灵活调整权限
配置:
- 管理后台 > 用户管理
- 点击用户的 "TVBox Token" 管理
- 生成 Token 并选择可访问的源
- 保存(留空=访问所有源)
优先级: 用户专属 Token > 全局 Token > 无验证
限制只允许特定IP访问:
后台配置步骤:
- 在管理后台的 "TVBox安全配置" 中启用 "IP白名单"
- 添加允许访问的IP地址
- 保存配置
支持的格式:
- 单个 IPv4 地址:
192.168.1.100 - IPv4 CIDR:
192.168.1.0/24、10.0.0.0/8 - 单个 IPv6 地址:
2001:db8::1 - IPv6 CIDR:
2001:db8::/32 - 通配符:
*(允许所有,不推荐)
防止频繁访问滥用:
后台配置步骤:
- 在管理后台启用 "频率限制"
- 设置每分钟允许的最大请求次数(默认60次)
- 保存配置
https://your-domain.com/api/tvbox
https://your-domain.com/api/tvbox?token=你的token
https://your-domain.com/api/tvbox?format=base64&token=你的token
- 在后台启用 "Token验证" 即可
- 建议定期更换token以提高安全性
- 建议启用所有三种安全机制:
- Token验证(必选)
- 频率限制(推荐设置为30次/分钟)
- IP白名单(如果IP相对固定)
- 可以仅使用IP白名单限制内网访问
- 或使用Token验证提供额外安全性
- TVBox兼容性:所有安全机制都是可选的,默认保持无鉴权兼容TVBox
- 后台配置:所有设置都在管理后台中完成,实时生效无需重启
- Token安全:token一旦启用,需要在TVBox中配置完整URL才能访问
- IP白名单:适合固定网络环境,移动设备可能IP变化
- 频率限制:防止暴力访问,正常使用不会触发
- 组合使用:可以同时启用多种安全机制
- 检查URL是否包含正确的token参数
- 确认IP是否在白名单中
- 检查是否触发频率限制(等待1分钟后重试)
- 在管理后台查看TVBox安全配置是否正确保存
Invalid token:token不正确或缺失Access denied for IP:IP不在白名单中Rate limit exceeded:访问频率过高
- 实时预览:可以看到生成的TVBox配置URL
- 安全状态:显示当前启用的安全机制
- Token管理:支持自动生成或手动设置token
- IP管理:可视化添加/删除IP白名单
- 频率设置:滑块调整请求限制次数
这些功能让TVBox安全配置变得简单直观,无需编辑配置文件。
LunaTV 实现了双层防御机制来保护用户免受不当内容影响。
在 TVBox 配置接口 (/api/tvbox) 中,通过 filter 参数控制是否过滤成人内容:
默认行为(启用过滤):
https://your-domain.com/api/tvbox?token=xxx
- 自动过滤标记为
is_adult=true的视频源 - 保护用户不会看到成人内容源
显式关闭过滤(仅管理员):
https://your-domain.com/api/tvbox?token=xxx&filter=off
- 需要显式传递
filter=off参数 - 适用于管理员调试或特殊需求
权限判断逻辑:
- 优先级:用户配置 > 用户组配置 > 全局配置
filter参数和用户权限必须同时满足才显示成人源
即使客户端绕过第一层防御,第二层依然会拦截成人源的 API 请求。
工作原理:
- 客户端通过
/api/proxy/cms请求外部 CMS API - 代理检测请求 URL 是否属于成人源(通过 origin 匹配)
- 如果是成人源且未传
filter=off,返回空数据:{ "code": 200, "list": [], "total": 0 } - 静默拦截,避免客户端报错
配置要求:
- 在管理后台的"视频源管理"中,将成人源标记为
is_adult: true - 系统会自动识别并拦截这些源的 API 请求
标记成人源:
// 在视频源配置中
{
"key": "adult_source",
"name": "成人视频源",
"api": "http://adult-api.com/api.php",
"is_adult": true // ← 关键标记
}用户权限配置:
// 方式1:用户级别(优先级最高)
{
"username": "user1",
"showAdultContent": false // 禁止该用户访问
}
// 方式2:用户组级别
{
"tagName": "vip",
"showAdultContent": true // VIP 用户允许访问
}
// 方式3:全局级别(默认)
{
"ShowAdultContent": false // 全局默认禁止
}客户端请求 TVBox 配置
↓
第一层:检查 filter 参数和用户权限
↓ (启用过滤)
过滤掉 is_adult=true 的源
↓
客户端获得干净的配置
↓
客户端请求某个源的 API
↓
第二层:CMS 代理检查源是否为成人源
↓ (是成人源且无 filter=off)
返回空数据,阻止内容加载
系统会输出详细的过滤日志:
# 第一层过滤
[TVBox] 🛡️ 成人内容过滤已启用(filter=default, showAdultContent=false),剩余源数量: 15
# 第二层拦截
[CMS Proxy] 🛡️ Blocked adult source: http://adult-api.comLunaTV 提供 CMS 代理接口来解决以下问题:
- HTTPS 页面无法请求 HTTP 采集源(Mixed Content)
- 第三方 API 的 CORS 跨域限制
- 老旧 CMS 接口的兼容性问题
/api/proxy/cms?url=<目标URL>
只允许代理以下合法的 CMS API 请求:
?ac=class- 获取分类?ac=list- 获取列表?ac=videolist- 获取视频列表?ac=detail- 获取详情/api/vod- API 路由/index.php- PHP 入口/provide/vod- 提供接口
// 原始请求(可能被 CORS 阻止)
const apiUrl = 'http://example.com/api.php?ac=list';
// 通过代理请求
const proxiedUrl = `/api/proxy/cms?url=${encodeURIComponent(apiUrl)}`;
const response = await fetch(proxiedUrl);1. 成人内容拦截
/api/proxy/cms?url=http://adult-api.com/api.php?ac=list
- 自动检测成人源并返回空数据
- 配合
filter=off参数可关闭拦截
2. 完整浏览器头伪装
- User-Agent、Accept、Referer 等完整模拟
- 提高老旧 CMS 接口兼容性
3. 超时和重试
- 20 秒超时控制
- 详细的错误类型分类(DNS、连接、SSL 等)
4. 响应优化
- 自动清理 BOM 和空白符
- 支持 JSON 和非 JSON 响应
- 5 分钟缓存减少重复请求
| 错误类型 | 说明 | 状态码 |
|---|---|---|
Missing required parameter: url |
缺少 url 参数 | 400 |
Invalid URL format |
URL 格式错误 | 400 |
URL not in whitelist |
URL 不在白名单中 | 403 |
TIMEOUT |
请求超时(20秒) | 502 |
DNS_ERROR |
DNS 解析失败 | 502 |
CONNECTION_REFUSED |
连接被拒绝 | 502 |
SSL_ERROR |
SSL/TLS 证书错误 | 502 |
公网部署:
- 白名单机制已内置,无需额外配置
- 建议配合 Token 验证使用
- 监控代理日志防止滥用
内网使用:
- 可直接使用,无安全风险
- 主要用于解决 Mixed Content 问题
本文档中的 CMS 代理接口 和 纵深防御策略 参考了 DecoTV 项目的优秀实现,特此感谢!