【问题标题】:popen vs system: is popen as evil as system?popen vs system:popen和系统一样邪恶吗?
【发布时间】:2011-10-15 06:29:04
【问题描述】:

popen 缓冲输出而系统没有。这是唯一的区别吗?

我知道 popen 和 system 都通过 shell 运行命令。但是,popen() 是 evil 还是 system()?

【问题讨论】:

  • 任何通过 shell 命令运行外部程序的东西都可能是邪恶的。但像往常一样,邪恶掌握在持有者的手中。
  • 当心! cplusplus.com 以许多错误而闻名。链接页面中的解释是cr@p的负载
  • system 如此邪恶的解释中最幽默的一点是,您运行的程序可能感染了恶意软件,而另一方面,一些无用的反恶意软件可能会显示警告,因为运行任何其他程序是危险的。 :-) 如果恶意软件进入您使用system 调用的另一个程序,那么您将遇到与system 无关的完全不同的问题,并且如果您的防病毒程序抱怨启动任何其他程序,那么诸如编程之类的任务将不会很有趣。
  • @Ian 好吧,文档,现在我也看到了论坛。这篇文章写得很好,但是错了。
  • “邪恶”只是夸张。可悲的是,人们读到这种夸张的说法,并认为它的意思是“将召唤上古之神并导致恐惧克苏鲁从他在拉莱耶的冰冻坟墓中苏醒的持续存在的邪恶”,而它真正的意思是“最好小心并知道你在做什么。”

标签: c++ system popen


【解决方案1】:

听着,“系统是邪恶的”的全部内容,本质上是那些不考虑其特定用例的安全后果的人。 system 比你自己的 fork/dup/exec 更“邪恶”的唯一原因是使用不当,有人可能会引入恶意命令行。所以,例如

#include <stdlib.h>

int main(int argc, char** argv){
    (void) system(argv[1]);
}

肯定是哑,因为有人可以将rm -rf / 作为参数。当然,使用 popen 可以完成类似的愚蠢操作。

然后考虑使用用户字符串作为命令执行 fork 和 exec 的操作:存在完全相同的漏洞和愚蠢。

邪恶——也就是说,错误——在于使用随机输入字符串作为没有过滤的命令,而不是在 system 调用中。

【讨论】:

    【解决方案2】:

    system 和 popen 都不是邪恶的。它们很容易以导致您的程序被黑客入侵的方式使用。如果您需要二进制文件来运行单独的二进制文件,则需要使用其中一个调用。正确使用即可。

    话虽如此,system("PAUSE") 有点过分了,而一个简单的cin.getline() 就可以了。

    【讨论】:

      猜你喜欢
      • 2013-11-16
      • 2015-02-22
      • 2016-11-18
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      相关资源
      最近更新 更多