2014-05-15 37 views
1

我知道这可以很容易地通过使用平台的系统()实现来完成。但是,从我读到的system通常不是最好的方法,可能会导致安全缺陷。这种类型的问题有没有不同的行业标准方法?用户有什么选择可以做这种事情?从另一个程序发送参数给可执行文件

我特别感兴趣的是在C/C++中的实现,但我不认为这种类型的东西会依赖于语言;我怀疑它应该是平台特定的。

+0

为了澄清,你有一个程序,并且你想运行另一个程序(比如'system'),但是使用其他方法而不是'system'调用?那么是的,它将取决于平台。在POSIX平台(如Linux或OSX)上阅读有关['fork'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html)系统调用和['exec'系列函数] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html),在Windows上阅读有关['CreateProcess'](http://msdn.microsoft.com/en-us/library/windows/桌面/ ms682425%28V = vs.85%29.aspx)。 –

+0

正确。我不反对使用'system',我刚刚读到使用这个会造成安全威胁。我只是好奇看看有什么替代方案。谢谢! – sherrellbc

回答

2

您可能正在寻找标准的POSIX功能forkexec*。这适用于Unix类平台(Linux和Mac)。

在Windows上,有CreateProcess API。

forkexec有点奇怪,因为fork完全重复您当前的过程并返回不同的结果到每个副本。程序的新副本应该设置任何需要的设置(关闭不应在两个程序中打开的文件,更改环境变量等),最后调用exec函数之一,该函数用指定的程序替换该进程(同时保持当前打开的文件描述符等)。

1

您可能已经看到它的提及,但fork()exec通常是Linux编程中的选择,但对于Windows,您必须使用OS API创建新进程。对于小型项目来说,system()仍然是不错的选择,因为它们通常不会遇到与大牌软件相同的恶意问题。它还本身等待子应用程序在继续之前在父程序中返回,如果您使用外部二进制文件运行计算或其他内容,并且您将获得返回值,则这可能是一个很好的特性。

很多人会告诉你,使用system()是错的,但它确实不是。由于其固有的问题,它在专业市场上受到了折磨,但否则就会起作用。

+1

'系统'真的非常有限。 –

+1

这就是,更不用说shell命令本身就是平台特定的,使得它的本地跨平台容量几乎没有实际意义。但是,如果您只是试图让某些东西起作用,这对工作流程很重要,但在发布之前的某个时候应该用一个更精美的示例来取代它会很有帮助。 – Kats

2

您提到system的安全问题是system使用系统的shell执行程序并解析其参数,如果您不小心,shell可以执行您不想要的操作。 (例如,“ls”+参数似乎无害,但如果参数是“; rm -rf/*”),它可以删除数据。

如果你控制参数,或者如果你仔细地将参数中的任何shell元字符转义为系统,你应该没问题,尽管避免它是最可靠的。

要避免安全问题,使用产卵一个程序,让您指定列表的参数的方法,已经被解析,而不是指定必须被解析以提取参数的字符串:

这些不准确比赛系统()的行为(系统,例如,确实有点与信号处理和返回值),但他们接近。

+0

为了所有这一切的美好,消毒你的信息! – Kats

相关问题