2011-04-15 103 views
0

我开发了一个在Windows和Linux下使用的C++ CGI应用程序。 它必须启动另一个应用程序。目前我使用一个系统调用:C++系统调用安全问题

system("anotherApp.exe -arguments"); 

该呼叫我需要在Windows上运行,为CMD.EXE人权事业的系统调用启动一个外壳。这是一个安全问题,因为我的应用程序是一个CGI应用程序,并在Web服务器上使用。

是否有另一种可能性调用一个应用程序而无需启动一个新的shell?

回答

1

System()启动控制台窗口并在该控制台窗口中运行该程序。

popen()在没有控制台窗口的情况下运行程序,并将控制台输出重定向到管道。

CreateProcess()只是启动程序。你通过一个标志参数告诉它如何处理控制台。它还允许程序以不同的权限运行到父程序。

如果您对cmd.exe没有权限,则系统()将关闭菜单。

只要程序不需要写入stdout或stderr,popen()可能会工作,因为这会丢失。

你可能是最好写simething这样的:

bool RunProgram(const std::string &sProgram, bool bWaitForFinish) 
{ 
#if defined(Win32) 
    // Launch with CreateProcess() 
    // wait if required 
#else 
    // launch with fork()/exec() or even system() 
    // wait if required 
#endif 
    return error_status; 
} 
+0

你是对的。 popen()不起作用,因为我必须写入标准输出。但CreateProcess()工作正常。谢谢。 – 2011-04-18 08:15:46

2

您可以使用CreateProcess并使用该命令设置安全权限。您也可以模拟受限制的用户,以确保您所调用的流程仅具有您提供给它的权利。

+0

感谢。我会尝试。但由于我使用Windows和Linux,我更喜欢独立于操作系统的解决方案。我找到了函数popen()。我会尝试它是否像system()一样启动一个shell。 – 2011-04-15 12:25:12

+0

@juergen你说得对,因为某种原因,我以为你说你只在Windows机器上。那是我的错。 – 2011-04-15 12:37:15

+0

'popen'和'system'都产生一个shell(在linux和windows上)(它在win32中被称为'_popen')。我认为你不会找到一种随身携带的方式来做你的事情。 – Mat 2011-04-15 12:38:31