在 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);
他们可以调用各种恶意命令。
另一个安全漏洞来自这一点,有人可能会用一些恶意代码替换您系统上的 cls
或 clear
命令。
克服这个问题的唯一方法是以某种方式保护您的系统,这是不可能的。
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()
没有任何问题,就像您正在做的那样。
我看了很多回答说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);
他们可以调用各种恶意命令。
另一个安全漏洞来自这一点,有人可能会用一些恶意代码替换您系统上的 cls
或 clear
命令。
克服这个问题的唯一方法是以某种方式保护您的系统,这是不可能的。
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()
没有任何问题,就像您正在做的那样。