C ++在公共函数中使用system()安全还是不安全?

时间:2016-07-01 17:35:10

标签: c++ windows multithreading system

我有一个程序,我需要执行.exe将图像转换为DDS才能在我的程序中使用它们。为此,我有一个函数,我可以将命令传递给system(),如下所示:

unsigned int __stdcall Scene::ExecuteCommand(void* command)
{
    return system(static_cast<char*>(command));
}

我前几天想到这可能是不安全/危险但我不是100%确定它是否存在(如果是,它是如何不安全/危险的)。该功能按预期工作,但这是不好的做法?我应该担心吗?

我的问题不是重复,因为我询问在函数中使用system()的细节和影响。我的函数允许任何命令行参数以多线程方式传递给系统。

1 个答案:

答案 0 :(得分:2)

这是一种相对不安全的做法:如果使用未经检查的参数调用此函数,则该函数可能成为弱点的来源。

示例:

string my_clean_command{"convertdss.exe -n "};    // we have best intentions
string my_user_param;                             // but we don't know the user
cout<<"Enter file to convert: ";
getline (my_user_param);   // user enters: "image.jpg | rm *.*"
string my_corrupted_command = my_clean_command + my_user_param;   // ouch!!
my_scene.ExecuteCommand(my_corrupted_command.c_str());            // ouch!!!

当命令由本地命令处理器执行时,它将是不可移植性的源(或者如果用户将其会话配置为使用异常命令处理器,则会出现意外)。

最后,您将启动一个独特的进程,创建一些并非绝对必要的系统开销。