2011-04-15 127 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