popen缓冲输出而系统没有。这是唯一的区别吗?
据我所知,popen和system都通过shell运行命令。但是,popen()和evil一样是system()吗?
答案 0 :(得分:26)
看,关于“系统是邪恶的”的整个事情本质上是那些不考虑其特定用例的安全后果的人。 system 比做自己的fork / dup / exec更“邪恶”的唯一原因是使用不当,有人可能会引入恶意命令行。所以,例如
#include <stdlib.h>
int main(int argc, char** argv){
(void) system(argv[1]);
}
当然是 dumb ,因为有人可以将rm -rf /
作为参数放入。当然,使用 popen 可以完成同样愚蠢的事情。
但是后来考虑使用命令的用户字符串执行 fork 和 exec 的操作:存在完全相同的漏洞和愚蠢。
邪恶 - 也就是说,错误 - 在于使用随机输入字符串作为没有过滤的命令,而不是在系统调用中。
答案 1 :(得分:7)
系统和popen都不是邪恶的。它们很容易使用,导致程序被黑客入侵。如果您需要二进制文件来运行单独的二进制文件,则需要使用其中一个调用。只需正确使用它。
话虽如此,当一个简单的system("PAUSE")
可行时,cin.getline()
有点过分。