fix: 渲染引擎全链路安全加固 P0+P1 (#317)
CI/CD Pipeline / Validate Code Quality And Tests (push) Has been cancelled
CI/CD Pipeline / Unit Tests (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Frontend Lint (push) Has been cancelled
CI/CD Pipeline / Build Staging API Image (push) Has been cancelled
CI/CD Pipeline / Build Staging Worker Image (push) Has been cancelled
CI/CD Pipeline / Build Staging Web Image (push) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
CI/CD Pipeline / Build Production API Image (push) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (push) Has been cancelled
CI/CD Pipeline / Build Production Web Image (push) Has been cancelled
CI/CD Pipeline / Deploy Production (push) Has been cancelled
CI/CD Pipeline / Production Browser E2E (push) Has been cancelled

This commit was merged in pull request #317.
This commit is contained in:
2026-07-14 18:15:21 +08:00
parent 7f767e2dd1
commit c88be032c1
20 changed files with 928 additions and 210 deletions
+32 -6
View File
@@ -465,18 +465,44 @@ class PiPEngine:
layer: PiPLayerConfig,
asset_path_map: dict[str, Path],
) -> Path | None:
"""验证图层素材是否可用,返回本地路径或None(降级跳过)."""
"""验证图层素材是否可用,返回本地路径或None(降级跳过).
安全:
- local_path 类型:必须在允许的目录内,防止路径遍历
- url 类型:必须通过 SSRF 安全校验
"""
from video_processing.path_security import is_in_allowed_dirs
from video_processing.url_security import UrlSecurityError, validate_url_safety
try:
if layer.source_type == "local_path":
path = Path(layer.source)
if path.exists():
return path
if not layer.source:
return None
# 路径安全校验:必须在允许目录内
src_path = Path(layer.source)
if not src_path.exists():
return None
if not is_in_allowed_dirs(src_path):
logger.warning(
"PiP local_path 不在允许目录内,拒绝: %s",
layer.source[:80],
)
return None
return src_path.resolve()
elif layer.source_type == "asset_id":
if layer.source in asset_path_map:
return asset_path_map[layer.source]
return None
elif layer.source_type == "url":
# URL类型由调用者负责下载,这里返回标记
return None # 暂时不支持直接URL
# URL类型:先做SSRF安全校验,由调用者负责实际下载
try:
validate_url_safety(layer.source, purpose="pip_source")
logger.info("PiP URL 安全校验通过: %s", layer.source[:80])
except UrlSecurityError as e:
logger.warning("PiP URL 安全校验失败: %s (error=%s)", layer.source[:80], e)
return None
# 暂时不支持直接URL下载,返回None表示降级跳过
return None
except Exception as e:
logger.warning("PiP素材验证失败: %s", e)