在 C++ 中是否有替代 'system()' 命令的方法?

Is there an alternative to the 'system()' command in C++.?

我看了很多回答说system()命令不好。首先,为什么这么糟糕?其次,是否有不会产生此类安全漏洞的替代方案?我os很想知道在 C++ 中是否有清除屏幕的方法。在 python 中,我有一个清晰的函数,它检查 os 名称并运行 system('cls')system('clear')。这也是一个安全漏洞吗?如果是这样,是否有 python 替代方案?

First off, why is it so bad?

因为你在代码中引入了对 OS 的依赖,使其不可移植。

Second off, is there an alternative that doesn't produce such a security hole?

不,现有的替代方案(POSIX兼容)fork()execxx()pipe()有引入OS依赖的相同问题和安全漏洞。

Is this a security hole as well?

主要的安全漏洞是通过

等参数构造的命令引入的
void exec_ls(const std::string param) {
    std::string cmd;
    cmd = "ls -l " + param;
    system(cmd.c_str());

如果有人设法通过 param 注入一些额外的命令,例如

 std::string param = "dir ; rm -rf /*";
                       // ^^^^^^^^^^^
 exec_ls(param);

他们可以调用各种恶意命令。 另一个安全漏洞来自这一点,有人可能会用一些恶意代码替换您系统上的 clsclear 命令。
克服这个问题的唯一方法是以某种方式保护您的系统,这是不可能的。

If so, is there a python alternative?

使用不同的编程语言作为中间调用者并不能解决我上面提到的问题。

system 函数(跨多种语言,包括 Python 和 C++)本质上并不“坏”,但它们给正确使用带来了困难。

安全

您需要绝对确定您通过 system 执行的任何操作都是安全的。

如果你写 system("echo hello " + name) 那么你需要绝对确定 name 不能被恶意用户控制。 name = "; rm -rf /" 会导致 echo hello ; rm -rf /,所以如果这是来自用户,通过网络表单或数据库之类的东西,那么你需要非常小心,我会推荐一个更复杂的解决方案比 system.

system("clear") 这样的电话对您来说是安全的。

可用性

系统调用给你几个输出(我将给出一个调用 bash shell 的例子):

  • 状态代码(shell 是否表示错误情况)
  • STDOUT 的内容
  • STDERR 的内容

system returns 状态码。对于像ls这样的命令,你有兴趣接收STDOUT,你也可以查看状态码。这对于 system.

来说很笨重

Python subprocess 模块被社区普遍认为是管理这些问题的更简单方法。

如何管理控制台

如果您正在尝试管理控制台显示,您可能会对像 ncurses 这样的库感兴趣,它具有广泛的 OS 支持。

添加 ncurses 作为依赖项可能是 heavy-handed,如果清除屏幕是您唯一需要做的事情。如果是这样,那么我认为使用 system() 没有任何问题,就像您正在做的那样。