проблема безопасности системного вызова c ++ - PullRequest
0 голосов
/ 15 апреля 2011

Я разрабатываю C ++ CGI-приложение, которое используется в Windows и Linux. Это должно запустить другое приложение. В настоящее время я использую системный вызов:

system("anotherApp.exe -arguments");

Для этого вызова мне нужны права на выполнение для cmd.exe в Windows, потому что системный вызов запускает оболочку. Это проблема безопасности, поскольку мое приложение является приложением CGI и используется на веб-сервере.

Есть ли еще одна возможность вызвать приложение без запуска новой оболочки?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Вы можете использовать CreateProcess и настроить разрешения безопасности с помощью этой команды.Также вы можете выдавать себя за пользователя с ограниченными правами, чтобы быть уверенным, что вызываемый вами процесс имеет только те права, которые вы ему даете.

1 голос
/ 15 апреля 2011

Система () запускает окно консоли и запускает программу в этом окне консоли.

popen () запускает программу без окна консоли и перенаправляет вывод консоли в канал.

CreateProcess () просто запускает программу. Вы передаете аргумент flags, указывающий, что делать с консолями. Это также позволяет программе запускаться с различными разрешениями для родительской программы.

Если у вас нет прав на cmd.exe, то system () отключается от меню.

popen () может работать, если программе не нужно записывать в stdout или stderr, поскольку это будет потеряно.

Возможно, вам лучше написать что-то вроде этого:

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;
}
...