system()是否称为邪恶?

Ale*_*exK 16 c++ posix

我正在设计一个C++应用程序,除其他外,它不时地执行一些脚本.该应用程序应该是高效的,并且最好是平台独

但问题是:有没有理由不应该使用system()call来启动脚本并使用例如POSIX设施?到目前为止我所看到的关于此事的讨论通常归结为:

  1. system()不太灵活.(我都可以)
  2. 它无法控制正在执行的命令.(对我来说很好,我只需要脚本中的返回值)
  3. 它不是平台独立的.(现在,这将是一个问题.我真的很想看到一个例子,它在不同的平台上表现不同)
  4. 这是一个安全问题.(同样,这也是一个问题.有人能提供潜在安全问题的例子system()吗?)
  5. 还有其他问题吗?

K-b*_*llo 5

3)它不是平台独立的(现在,这将是一个问题.我真的很想看到一个例子,它在不同的平台上表现不同)

好吧,例如system("ls"),在Windows中可能会失败,因为没有ls命令.

4)这是一个安全问题.(同样,这将是一个问题.有人可以提供system()潜在安全问题的示例吗?)

如果传递给的参数system来自用户输入,并且没有正确验证,则可以使用它来执行具有原始执行程序的权限级别的不需要的东西.如果它的静态内容,很容易在可执行映像中找到它并修改它以做坏事.

  • @AlexK:没有*更安全的*替代方案,问题来自于执行一串代码,因此对于每个替代方案都是相同的. (3认同)

Mar*_*k B 4

(3) 如果您只是想要一个反例,例如 grep 在 Solaris 与 Linux 上的行为有所不同。

(4) 您的程序的权限由其衍生程序继承。如果您的应用程序曾经以特权用户身份运行,那么有人所要做的就是将他们自己的程序与您外壳的名称一起放入,然后可以执行任意代码(这意味着您永远不应该运行使用systemroot 身份的程序)或 setuid 根)。

(5) 从长远来看,使用 posix 设施可能会更明智,因为您不必依赖程序运行时已经存在的一组特定的外部脚本或二进制文件。