问题
pdf_translate.go 中有以下几个问题:
1. mustMarshal 手写 JSON 序列化有缺陷 (严重)
- 只替换
" → \",没处理 \n、\t、\r 等控制字符,消息含换行时会破坏 SSE data: 行格式
uint 类型(如 DocID)没被 switch 覆盖,走 default 用 %v 输出
- 应直接用
json.Marshal 替代手写实现
2. SSE 并发写不安全 (严重)
stdout goroutine、stderr goroutine 和主线程 cmd.Wait() 后的完成事件都在并发调用 c.Response().Write() + Flush()。echo 的 Response Writer 不是线程安全的,并发写可能导致 SSE 数据交错或损坏。
建议用 mutex 保护 Write+Flush,或用 channel 收集消息由单一 goroutine 写出。
3. shell 拼接命令有注入风险 (低)
cmdStr := fmt.Sprintf("source '%s/bin/activate' && pdf2zh --service openai '%s'", pdf2zhVenv, sourcePdf)
sourcePdf 路径含单引号时可以逃逸。实际概率低(路径由系统生成),但可以改用 exec.Command 直接调 venv 中的 pdf2zh 二进制,避免 shell 拼接。
4. filterPDF2ZhOutput 冗余匹配 (低)
if strings.Contains(lower, "converting") || strings.Contains(lower, "converting pdf") {
"converting pdf" 已被 "converting" 匹配,后者冗余。
5. 未传语言方向参数 (低)
pdf2zh 支持 --lang-in / --lang-out 参数,当前命令只传 --service openai,语言方向完全依赖 pdf2zh 自动检测。如果源文档语言判断不准,翻译方向可能出错。
问题
pdf_translate.go中有以下几个问题:1. mustMarshal 手写 JSON 序列化有缺陷 (严重)
"→\",没处理\n、\t、\r等控制字符,消息含换行时会破坏 SSEdata:行格式uint类型(如DocID)没被 switch 覆盖,走default用%v输出json.Marshal替代手写实现2. SSE 并发写不安全 (严重)
stdout goroutine、stderr goroutine 和主线程
cmd.Wait()后的完成事件都在并发调用c.Response().Write()+Flush()。echo 的 Response Writer 不是线程安全的,并发写可能导致 SSE 数据交错或损坏。建议用 mutex 保护 Write+Flush,或用 channel 收集消息由单一 goroutine 写出。
3. shell 拼接命令有注入风险 (低)
sourcePdf路径含单引号时可以逃逸。实际概率低(路径由系统生成),但可以改用exec.Command直接调 venv 中的 pdf2zh 二进制,避免 shell 拼接。4. filterPDF2ZhOutput 冗余匹配 (低)
"converting pdf"已被"converting"匹配,后者冗余。5. 未传语言方向参数 (低)
pdf2zh 支持
--lang-in/--lang-out参数,当前命令只传--service openai,语言方向完全依赖 pdf2zh 自动检测。如果源文档语言判断不准,翻译方向可能出错。