diff --git a/app/integrated_app/routes/generate/step_audio_editx/edit.py b/app/integrated_app/routes/generate/step_audio_editx/edit.py
index 04c4c485..65bf602b 100644
--- a/app/integrated_app/routes/generate/step_audio_editx/edit.py
+++ b/app/integrated_app/routes/generate/step_audio_editx/edit.py
@@ -32,6 +32,7 @@
- 失败:HTMX HTML 错误片段
"""
+import html
import logging
import os
import time
@@ -193,20 +194,27 @@ async def step_audio_editx_edit_endpoint(
return _error_html(request, result.message, status_code=500)
audio_filename = os.path.basename(result.audio_path)
+ # 这些值全部或部分来自请求(edit_type / edit_info 是表单原文,source_path 由上传
+ # 文件名派生),此前直接插进 HTML 文本与属性 -> 反射型 XSS。quote=True 同时覆盖
+ # 属性上下文(data-audio-filename / src / href / download)。
+ esc_filename = html.escape(audio_filename, quote=True)
+ esc_source = html.escape(os.path.basename(source_path or ""), quote=True)
+ esc_edit_type = html.escape(str(edit_type), quote=True)
+ esc_edit_info = html.escape(edit_info or "(无)", quote=True)
success_html = f"""
-
+
✅ 音频编辑完成(耗时 {elapsed:.1f}s)
-
编辑类型: {edit_type}
-
编辑标签: {edit_info or "(无)"}
-
参考音频: {os.path.basename(source_path or "")}
+
编辑类型: {esc_edit_type}
+
编辑标签: {esc_edit_info}
+
参考音频: {esc_source}
输出时长: {result.duration:.2f}s
-
+
下载编辑后的音频
diff --git a/app/integrated_app/routes/generate/voicebox/convert.py b/app/integrated_app/routes/generate/voicebox/convert.py
index d0e04b1f..43a3a507 100644
--- a/app/integrated_app/routes/generate/voicebox/convert.py
+++ b/app/integrated_app/routes/generate/voicebox/convert.py
@@ -27,6 +27,7 @@
3. 点击转换,输出用目标音色重说源内容的音频
"""
+import html
import logging
import os
import time
@@ -183,20 +184,26 @@ async def voicebox_convert_endpoint(
# 构建 HTMX 成功响应
audio_filename = os.path.basename(result.audio_path)
+ # 同 step_audio_editx/edit.py:audio_filename / 两个 basename / tau 均可被请求侧
+ # 影响(上传文件名、表单值),此前直接插进 HTML 文本与属性 -> 反射型 XSS。
+ esc_filename = html.escape(audio_filename, quote=True)
+ esc_source = html.escape(os.path.basename(source_path or ""), quote=True)
+ esc_target = html.escape(os.path.basename(target_path or ""), quote=True)
+ esc_tau = html.escape(str(tau), quote=True)
success_html = f"""
-
+
✅ 音色转换完成(耗时 {elapsed:.1f}s)
-
源音频: {os.path.basename(source_path or "")}
-
目标音色: {os.path.basename(target_path or "")}
-
转换强度 (tau): {tau}
+
源音频: {esc_source}
+
目标音色: {esc_target}
+
转换强度 (tau): {esc_tau}
输出时长: {result.duration:.2f}s
-
+
下载转换后的音频