【问题标题】:Why does system() still exist?为什么 system() 仍然存在?
【发布时间】:2020-04-03 18:40:05
【问题描述】:

我知道这个问题:Why does system() exist? 但公认的答案是指 C89,一个 30 年的标准,它不会真正帮助我。据我所知,system() 是一个资源密集型安全漏洞,而且不能跨操作系统移植。即使有正当理由使用该功能,我也不相信有什么能阻止我写system("rm -rf /*")。一般来说,删除几乎所有内容的 1 行可能不是一个很好的语言功能。 This 文章宣称它是邪恶的,原因有很多。

在上面链接的问题中,一条评论指出系统“是执行系统特定内容的唯一可移植方式”。这对我来说没有意义,我用系统为某些 Linux 发行版编写的代码在 Windows 机器上不起作用。似乎“便携式系统特定”也是矛盾的。难道没有像windows.h这样的与机器对话的API吗?

那么系统是否有继续存在的正当理由,是否存在遗留应用程序,或者 C++ 只是没有解决它?

【问题讨论】:

  • system 执行任意命令不同于让它执行任意用户命令。你可以在你的程序中使用 #ifdef 或任何基于 windows vs linux 等的字符串文字。
  • “便携”如POSIX?
  • 您还可以使用 c++ 文件系统库删除文件,这甚至是一种删除文件的可移植方式。或者您可以只调用特定于操作系统的函数。删除 system() 不会阻止任何人编写有害代码。可能是为了向后兼容而保留的?因为有些程序实际上以一种很好的方式使用它。
  • 你会说fstream 不可移植,因为当我传递一个文件名时,我需要一个系统上的目录和另一个系统上的/ 之间的\ ?看到类比了吗?
  • 顺便说一句,如果有人声称某事是“邪恶的”,我会小心的。夸大往往是没有好的论据的标志(并非总是如此,但经常如此)。您链接的文章主要描述了滥用system 的坏处。我的意思是system("PAUSE")system("CLS").... 来吧,这当然是“邪恶的”。除此之外,该文章还提到了手册,其中提到了您必须注意的事项以及“它的真正作用”,然后将其称为“邪恶”。这是糟糕的风格恕我直言。锤子并不邪恶,因为你可以用它敲打你的手指。

标签: c++


【解决方案1】:

如果您删除system(),您会获得什么安全性?您可以使用fork()exec() 实现相同的功能,这就是system() 在内部所做的一切。

您在计算机上运行的任何程序都必须信任沙盒。在沙盒环境中,首先要做的事情之一是调用 system(),但其他事情也必然会被禁用。

运行外部程序是一项不可删除的重要功能。

请记住,C++ 的定义原则之一是,该语言永远不会假定自己比程序员更聪明,也不会阻止程序员为所欲为,无论后果如何。

没有理由删除它,因为您始终可以使用其他工具来实现它。

【讨论】:

  • 另外,如果您不使用它,它不会将任何代码添加到您的可执行文件中。所以,顺其自然就好了。
  • @ThomasMatthews 没错。除非您的代码具有 RCE,否则它是不可利用的,并且如果您的代码存在比能够触发system() 的人更大的问题。 “有人闯入我的房子,这意味着他们可以使用微波炉!”
  • @tadman 这并不完全正确。使用system,您可以做到system ("myscript.bat")system ("myscript.sh"),这对于fork, createprocess, ... 来说是困难的,甚至是不可能的
  • @Landstalker 一点也不。您只需 exec 一个 shell 并将其传递给参数。这就是system 所做的一切。只需查看how system() is implemented 并查看execl shell 调用。
  • @Landstalker Windows 非 POSIX 库可能有不同的实现。如果他们发布了源代码,请查看。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多