我開發了一個在Windows和Linux下使用的C++ CGI應用程序。 它必須啓動另一個應用程序。目前我使用一個系統調用:C++系統調用安全問題
system("anotherApp.exe -arguments");
該呼叫我需要在Windows上運行,爲CMD.EXE人權事業的系統調用啓動一個外殼。這是一個安全問題,因爲我的應用程序是一個CGI應用程序,並在Web服務器上使用。
是否有另一種可能性調用一個應用程序而無需啓動一個新的shell?
我開發了一個在Windows和Linux下使用的C++ CGI應用程序。 它必須啓動另一個應用程序。目前我使用一個系統調用:C++系統調用安全問題
system("anotherApp.exe -arguments");
該呼叫我需要在Windows上運行,爲CMD.EXE人權事業的系統調用啓動一個外殼。這是一個安全問題,因爲我的應用程序是一個CGI應用程序,並在Web服務器上使用。
是否有另一種可能性調用一個應用程序而無需啓動一個新的shell?
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;
}
您可以使用CreateProcess並使用該命令設置安全權限。您也可以模擬受限制的用戶,以確保您所調用的流程僅具有您提供給它的權利。
感謝。我會嘗試。但由於我使用Windows和Linux,我更喜歡獨立於操作系統的解決方案。我找到了函數popen()。我會嘗試它是否像system()一樣啓動一個shell。 – 2011-04-15 12:25:12
@juergen你說得對,因爲某種原因,我以爲你說你只在Windows機器上。那是我的錯。 – 2011-04-15 12:37:15
'popen'和'system'都產生一個shell(在linux和windows上)(它在win32中被稱爲'_popen')。我認爲你不會找到一種隨身攜帶的方式來做你的事情。 – Mat 2011-04-15 12:38:31
你是對的。 popen()不起作用,因爲我必須寫入標準輸出。但CreateProcess()工作正常。謝謝。 – 2011-04-18 08:15:46