[英]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);
他们可以调用各种恶意命令。 另一个安全漏洞来自于某人可能用一些恶意代码替换您系统上的cls
或clear
命令。
克服这个问题的唯一方法是以某种方式保护您的系统,这是不可能的。
如果是这样,是否有 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 的示例):
system
返回状态码。 对于ls
这样的命令,你有兴趣接收 STDOUT,你也可以查看状态码。 这对于system
是笨拙的。
Python subprocess
模块被社区普遍接受,作为管理这些问题的一种更简单的方法。
如果您正在尝试管理控制台显示,您可能会对像ncurses
这样具有广泛操作系统支持的库感兴趣。
如果清除屏幕是您唯一需要做的事情,那么将ncurses
添加为依赖项可能会很严厉。 如果是这种情况,那么我认为像您一样使用system()
没有任何问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.