繁体   English   中英

C++ 中是否有替代“system()”命令的方法。?

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

我已经阅读了很多答案,说system()命令不好。 首先,为什么会如此糟糕? 其次,有没有不会产生这种安全漏洞的替代方案? 我最想知道是否有办法在 C++ 中清除屏幕。 在 python 中,我有一个 clear 函数来检查操作系统名称并运行system('cls')system('clear') 这也是一个安全漏洞吗? 如果是这样,是否有 python 替代方案?

首先,为什么会如此糟糕?

因为您在代码中引入了对操作系统的依赖关系,并使其不可移植。

其次,有没有不会产生这种安全漏洞的替代方案?

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

这也是一个安全漏洞吗?

主要安全漏洞是通过由参数构造的命令引入的,例如

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命令。
克服这个问题的唯一方法是以某种方式保护您的系统,这是不可能的。

如果是这样,是否有 python 替代方案?

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

system函数(跨多种语言,包括 Python 和 C++)本质上并不是“坏的”,但它们在正确使用方面存在困难。

安全

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

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

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

可用性

系统调用为您提供了几个输出(我将举一个调用bash shell 的示例):

  • 状态码(shell 是否指示错误情况)
  • 标准输出的内容
  • STDERR 的内容

system返回状态码。 对于ls这样的命令,你有兴趣接收 STDOUT,你也可以查看状态码。 这对于system是笨拙的。

Python subprocess模块被社区普遍接受,作为管理这些问题的一种更简单的方法。

如何管理控制台

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

如果清除屏幕是您唯一需要做的事情,那么将ncurses添加为依赖项可能会很严厉。 如果是这种情况,那么我认为像您一样使用system()没有任何问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM