有没有办法 "escape" linux 命令?

Is there a way to "escape" linux commands?

我正在提供一项服务,允许用户将 post 文件发送到我的网络服务器,然后服务器会将该文件(经过几次检查)复制到图像服务器。我的网络服务器和图像服务器之间通信的主要方式是 scp。但是,我还想维护用户文件名,所以它看起来像这样:

  1. 用户post将他们的文件发送到网络服务器
  2. Web 服务器检查文件是否受支持
  3. Web 服务器检查文件是否在文件大小限制内
  4. Web 服务器同意并尝试发送到图像服务器
  5. Web 服务器运行("scp " + 文件路径 +“root@imageServer:~/images”)
  6. 图像服务器收到文件并准备根据请求将文件发送给用户(文件夹是 public 将由 nginx 提供服务)

这里的危险部分是 scp 命令。我不是安全专家,但是有没有一种方法可以像数据库获得 SQL 注入一样劫持此命令?如果有人将他们的文件命名为恶意文件怎么办。有没有办法安全地将文件名加入脚本?要安全地 "escape" 命令?

我正在为 Web 服务器使用 express (node.js)。有没有另一种方法可以将文件从 Web 服务器发送到简单的 Ubuntu 安装,而无需 unix 命令或为图像服务器编写 REST api?有没有,那我可能根本不需要"escape"

顺便说一句,我之所以选择将图像服务器和 Web 服务器分开,是因为我想在将来扩展应用程序。例如,如果有 10 个 Web 服务器并且没有中央图像服务器,那么如果文件不在您请求的 Web 服务器上,则无法检索文件。

您可以 运行 没有 shell 的外部命令(因此 shell 元字符没有问题)使用 child_process.spawn (或 child_process). (显然,您不能将 shell 选项指定为默认 false 以外的任何选项。)

这让您不必担心文件路径中的元字符,但在我看来,让用户提供要在实时文件系统上使用的文件路径名称还有很多其他问题。就个人而言,我会自动生成安全的短名称,并将用户名与文件系统名称的对应关系保存在数据库中的某个地方。