You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Node.js中用exec调用pandoc转Word为PDF/HTML是否安全?有无更佳方案?

Node.js中调用Shell命令处理Word转PDF/HTML的安全性与替代方案

我在Node.js的服务器队列任务里,用最新版pandoc(3.2.1)把Word文件转成PDF或HTML做预览页。但觉得Node.js执行Shell命令不安全,想问这种方式到底安不安全?有没有更好的实现方案?(补充:这是独立的文件处理服务器,没权限访问其他资源,就算代码不安全也无所谓,哈哈)

以下是队列任务中的部分代码:

const fileKey='uploads/xxxx.docx';// the files are store in storage service's uploads dir
let filePath= this.downloadToLocalTmp(filePath)
let outputPath = tmpdir() + path.sep + (fileKey.substring(fileKey.lastIndexOf('/')));
filePath = filePath.replaceAll(' ', '');// by @joesv 's advice, keep safe `; rm -rf /` => ';rm-rf/' 
outputPath = outputPath.replaceAll(' ', '');

try {
  // using pandoc in next release (1.2.0)
  if (isUsePandoc) {
    // note: pandoc not support doc
    Logger.warn('using pandoc converting');
    const command = `pandoc --embed-resources -o ${outputPath} ${filePath}`;
    Logger.debug(`exec command: '${command}'`);
    const stdout = execSync(command, { timeout: timeout });
    Logger.debug(`exec command stdout: ${stdout.toString()}`);
  } else {
    // note: libreoffice support both doc + docx
    Logger.warn('using libreoffice converting');
    await libreOfficeFileConverter.convertFile(filePath, tmpdir(), 'pdf');
  }
  Logger.debug('convertWordFile finished : ' + filePath);
  return outputPath;
} catch (error) {
  Logger.error('convertWordFile error : ' + error);
  throw error;
}
// ... upload to storage service

安全性分析

  • 你的场景下风险极低:因为这是独立隔离的文件处理服务器,没有访问其他资源的权限,就算被注入恶意Shell命令,影响范围也仅限这台服务器本身,不会扩散到其他系统。
  • 当前代码的防护存在漏洞:仅替换空格不足以完全防止Shell注入。如果filePath或outputPath包含;、|、>、$这类Shell元字符,依然可能被拼接成恶意命令执行。比如filePath为malicious.docx; rm -rf /tmp/*时,原代码会执行删除临时目录文件的操作。

优化方案

1. 使用execSync的参数数组(最推荐)

Node.js的execSync支持传入参数数组,会自动对每个参数做转义处理,彻底避免Shell注入风险,写法如下:

// 替换原pandoc命令执行部分
const stdout = execSync('pandoc', [
  '--embed-resources',
  '-o', outputPath,
  filePath
], { timeout: timeout });

2. 强化路径验证

确保filePath和outputPath严格限制在临时目录范围内,防止路径遍历攻击。可以用path.resolve结合目录检查:

const tmpDir = tmpdir();
const resolvedOutputPath = path.resolve(outputPath);
if (!resolvedOutputPath.startsWith(tmpDir)) {
  throw new Error('Invalid output path');
}
// 对filePath做同样的检查

3. 关于纯Node.js库替代

目前成熟的纯Node.js库实现Word转PDF/HTML的很少,多数还是依赖pandoc、LibreOffice这类专业工具,所以调用Shell命令仍是主流方案——重点是安全地调用。

内容的提问来源于stack exchange,提问作者tkn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:05:16