Commit Graph

613 Commits

Author SHA1 Message Date
YuLi
79d795a767 修复 ffmpeg.snap 模板注入导致的命令执行 (#4789)
### Motivation
- 发现 `ffmpeg.snap` 可被 `setServerConfig` 修改并被直接作为 `snprintf`
格式串使用,攻击者可借此选择任意可执行文件从而触发远程命令执行(RCE),因此需要在代码层阻断可远程篡改入口并增加模板校验。
- 本次变更目标是快速切断远程覆盖向量并加入纵深校验,作为短期补丁同时为后续移除格式化命令模板并改用参数数组的长期修复铺路。 

### Description
- 在 `server/FFmpegSource.cpp` 的 `FFmpegSnap::makeSnap` 中增加模板校验逻辑,要求模板以
`%s` 开头、恰好包含 3 个 `%s` 占位符且不包含其它格式说明符,否则通过回调返回错误并且不启动子进程。
- 在 `server/WebApi.cpp` 的 `setServerConfig` 中将 `ffmpeg.snap` 加入不可通过 API
动态修改的黑名单(与已有的 `ffmpeg.bin` 限制保持一致),以切断远程通过 API 覆盖可执行程序的入口。
- 对非法模板的处理改为:不构造/执行命令并通过 `onSnap` 回调返回明确错误信息,降低误用导致的未定义行为风险。 

### Testing
- 运行 `git diff --check` 检查代码风格和差异冲突,结果通过。 
- 进行了构建验证:`cmake -S . -B build -DENABLE_WEBRTC=OFF -DENABLE_TESTS=OFF
-DCMAKE_BUILD_TYPE=Release` 且 `cmake --build build -j2` 完成并成功生成
`MediaServer` 可执行文件。
- 提交已生成并验证工作区干净(`git status --short --branch`),构建过程无新增错误或未解决警告导致失败。

------
[Codex
Task](https://chatgpt.com/codex/cloud/tasks/task_e_6a63e3fc74a08320865dbe10b93a14a2)
2026-07-27 22:57:19 +08:00
YuLi
4a24057e73 feat(http): decouple upload size limit from maxReqSize and harden file upload (#4780)
- Add maxUploadSize config (default 1GB) for custom HttpBody streaming uploads;
  maxReqSize now only controls in-memory buffering threshold
- Reject uploads exceeding maxUploadSize with 413 before writing any data
- Delete incomplete files on HttpFileStorage destruction
- Open HttpFileStorage in "wb" mode instead of "ab" to avoid stale data
- Pass content_size to writeData() for integrity validation
- Use uint64_t for content_len to support large file uploads
- Wrap HttpBody _on_completed callback in try-catch to prevent unhandled exceptions
- Make GET_CONFIG global variables read-only
- Update ZLToolKit submodule

---------

Co-authored-by: xiongziliang <771730766@qq.com>
2026-07-23 13:55:35 +08:00
xiongziliang
a485d89063 修复程序退出时访问NoticeCenter单例可能崩溃的bug 2026-07-08 11:12:22 +08:00
xiongziliang
6d2d586fb2 优化getSnap截图接口性能 2026-07-08 11:12:22 +08:00
xiongziliang
92681fe6e1 新增支持http文件上传功能 2026-07-08 11:12:22 +08:00
xia-chu
427bb56507 防止开启Python插件后,程序退出时异常崩溃 2026-05-04 10:49:08 +08:00
xia-chu
c440c45ce4 新增流健康度探针功能 2026-05-03 15:02:03 +08:00
Miau Lightouch
a9e0e1a81e fix(webrtc): fix GStreamer WHEP interop (#4720)
## Summary

This PR fixes GStreamer interoperability issues during WebRTC/WHEP
negotiation with ZLMediaServer.

GStreamer could fail to establish the connection for two separate
reasons:

1. ZLMediaServer generated a non-compliant ICE `ufrag`. The generated
value contained `_`, which is not a valid ICE character, so GStreamer
rejected the SDP.
2. ZLMediaServer did not correctly handle `bundle-only` offers and could
answer an accepted bundled m-line with `port=0`, which caused the later
WHEP negotiation to fail.

## Changes

- Generate ICE `ufrag` values using ICE-compliant characters only.
- Preserve and handle `a=bundle-only` correctly during SDP parsing and
answer generation.
- Return `port=9` instead of `port=0` for accepted bundled m-lines.
- Add regression coverage for `bundle-only` SDP handling.
- URL-encode `delete_webrtc` query parameters in the returned `Location`
header so ICE-safe identifiers remain round-trippable over HTTP.

## Validation

- Built with WebRTC and SCTP enabled.
- Added regression test: `test_webrtc_regression`
- Verified:
  - ICE-safe identifier round-trip through `delete_webrtc`
  - `bundle-only` SDP answer generation
2026-04-21 11:37:08 +08:00
ljx0305
502ee6a497 解决在window mingw 5.3环境下编译出现报错信息 (#4710)
解决在window mingw 5.3环境下编译出现如下报错信息
no known conversion from 'LONG (*)(EXCEPTION_POINTERS*) {aka long int
(*)(_EXCEPTION_POINTERS*)}' to 'LPTOP_LEVEL_EXCEPTION_FILTER {aka long
int (__attribute__((__stdcall__)) *)(_EXCEPTION_POINTERS*)}'
2026-04-11 09:39:35 +08:00
XiaoYan Lin
c3c0fb4448 支持rtsp回放控制 (#4691)
目前对接过很多第三方系统(海康ISC、大华ICC、华为IVS、中维等)都支持rtsp回放,觉得有必要支持该功能
2026-04-01 20:42:32 +08:00
xia-chu
899d9653a4 新增更新流代理的功能,支持修改已有拉流代理的URL和参数 2026-03-20 21:59:55 +08:00
xia-chu
0f704cca47 默认设置PYTHONPATH至pymkui后端代码 2026-03-19 19:36:27 +08:00
xia-chu
22dcde4bf3 支持同时cookie登陆与secret硬编码鉴权两种方式 2026-03-19 19:32:58 +08:00
xia-chu
e1d3c21529 新增add_stream_proxy python接口 2026-03-18 18:47:18 +08:00
xia-chu
1bc40690c9 修复http头传入python fast api失败的问题 2026-03-18 16:09:55 +08:00
xia-chu
752f705b36 支持打印python http api调试日志 2026-03-18 15:59:27 +08:00
xia-chu
fa7b0639d8 listStreamProxy与listStreamPusherProxy支持key筛选参数 2026-03-18 11:25:24 +08:00
xia-chu
3b54168b44 listStreamProxy接口支持返回track、status_str信息 2026-03-17 19:43:50 +08:00
xia-chu
4e170e9281 addStreamProxy新增force,支持强制重试拉流 2026-03-17 19:33:43 +08:00
xia-chu
ca47a1f8b2 http access事件新增文件绝对路径参数 2026-03-09 18:01:48 +08:00
xia-chu
f48caf90e8 downloadFile http api支持secret鉴权 2026-03-09 17:07:23 +08:00
xia-chu
b8301bd085 修复python on_create_muxer事件隐式拷贝对象的bug 2026-03-07 13:06:18 +08:00
xia-chu
d8880f032d 完善get_full_path接口 2026-03-07 12:19:00 +08:00
xia-chu
725fdf1786 http api请求有json body才解析 2026-02-25 12:21:43 +08:00
xia-chu
0ead9b6945 优化cookie登录逻辑 2026-02-25 12:01:49 +08:00
xia-chu
3514376a97 修复videostack开启后编译失败问题 2026-02-22 18:45:16 +08:00
xia-chu
3a35144243 新增cookie登录鉴权模式,避免secret硬编码鉴权安全缺陷 2026-02-19 23:09:37 +08:00
liangjianhua
8ca4b4d92a Add optional subnet_prefix parameter to searchOnvifDevice interface 2026-02-13 23:11:37 +08:00
夏楚
6d520ea6a3 新增支持Python混合编程模式 (#4579) 2026-02-10 13:28:42 +08:00
xia-chu
9cc4563fae getAllSession接口返回链接类型 2026-01-09 11:34:40 +08:00
张传峰
1191f15132 fix: windows下通过mingw编译报错 (#4617) 2026-01-03 23:11:45 +08:00
xia-chu
adb844032d 初步添加onvif客户端 2025-11-22 08:40:25 +08:00
xia-chu
68cc757708 修复getMediaList接口线程安全问题 (#4526) 2025-10-30 11:20:04 +08:00
xia-chu
5c58f39046 优化getMediaList接口,新增返回currentStamp字段,获取单个流时确保返回loss字段 (#4260) 2025-10-18 13:00:54 +08:00
xia-chu
6d01aa6389 loadMP4File接口新增支持seek_ms与speed参数 (#4261) 2025-10-18 12:36:46 +08:00
xia-chu
046bdecd1e 修复release编译产出文件过大的问题 2025-10-11 18:58:10 +08:00
baigao-X
3fb43c5fef feat: 增加webrtc代理拉流 (#4389)
- 增加客户端模式,支持主动拉流、推流:
   - addStreamProxy接口新增支持whep主动拉流,拉流地址目前只兼容zlm的whep url。
   - addStreamPusherProxy接口新增支持whip主动推流,推流地址目前只兼容zlm的whip url。
   - 以上推流url格式为webrtc[s]://server_host:server_port/app/stream_id?key=value, 内部会自动转换为http[s]://server_host:server_port/index/api/[whip/whep]?app=app&stream=stream_id&key=value。

- 增加WebRtc p2p 模式:
  - 增加 ICE FULL模式。
  - 增加STUN/TURN 服务器。
  - 增加websocket 信令。
  - 增加P2P代理拉流。

---------

Co-authored-by: xia-chu <771730766@qq.com>
Co-authored-by: mtdxc <mtdxc@126.com>
Co-authored-by: cqm <cqm@97kid.com>
2025-09-20 16:23:30 +08:00
xia-chu
97d2a1fb08 修复溯源url模板带参数时溯源失败的问题 2025-09-12 21:50:30 +08:00
xia-chu
88b422db08 优化pauseRtpCheck接口,新增pause_seconds参数 2025-09-09 23:11:48 +08:00
xia-chu
5686027fc2 修复MediaSource::close线程安全问题
主动或无人观看关闭流可能会由于线程安全问题导致崩溃
2025-09-09 22:02:20 +08:00
ShineSea
c89caf560a 优化WebApi ListRtpServer接口实现 (#4436) 2025-09-08 19:00:45 +08:00
yingxiaodong
2faa04da30 bug-fix: rtpserver死锁 (#4421)
1、RtpServer对应的socket在读取数据后,会加锁后进行数据处理
  a) LOCK_GUARD(_mtx_event);
  b) _on_multi_read
当_on_multi_read处理中出现问题,会通过回调,调用 s_rtp_server.erase(key); ,
这里锁的调用顺序为:_mtx_event -> s_rtp_server._mtx
2、当外部调用api关闭RtpServer时,会先调用 s_rtp_server.erase(key);
,释放RtpServer对象时,会调用Socket的 setOnRead(nullptr),这里会调用Socket的 _mtx_event。
这里的锁调用顺序为:s_rtp_server._mtx -> _mtx_event
以上两种情况,存在 交叉调用两把锁的问题,会出现死锁。
2025-09-01 11:35:50 +08:00
xia-chu
41a71f7994 ffmpeg命令行支持shell语法 2025-08-23 11:54:58 +08:00
xia-chu
f524a0ebbd 配置文件auto_close开启后也触发无人观看hook(不处理回复) 2025-08-23 10:43:32 +08:00
xia-chu
652ac9fe82 新增获取poller监听fd个数方法 2025-08-10 12:15:56 +08:00
xia-chu
5d9ced2cf3 startSendRtp相关接口新增enable_origin_recv_limit参数控制是否开启源端限流
多倍速rtp转发时,在tcp模式下,如果转发速度跟不上接收速度将导致转发失败,通过开启该参数,可以确保历史视频多倍速下载成功
2025-08-02 21:14:42 +08:00
xia-chu
c9a0025620 新增startRecordTask接口,支持录制事件视频
用户可以录制当前时间前后一定时间内的视频,配置文件gop_cache设置较大时历史视频才能录全
2025-08-02 21:00:30 +08:00
xia-chu
b1e1a0f174 新增deleteSnapDirectory删除截图接口 2025-08-02 21:00:30 +08:00
ljx0305
1ead079af4 修正判断Json::Value::find函数返回值 (#4347)
修正Json::Value::find函数返回值并非iterator而是Value指针
2025-07-10 14:15:52 +08:00
PioLing
47fd8e9fc3 Add exception handling for FFmpeg cmd checked. (#4343) 2025-07-10 14:14:57 +08:00