我有一个程序,我需要执行.exe将图像转换为DDS才能在我的程序中使用它们。为此,我有一个函数,我可以将命令传递给system(),如下所示:
unsigned int __stdcall Scene::ExecuteCommand(void* command)
{
return system(static_cast<char*>(command));
}
我前几天想到这可能是不安全/危险但我不是100%确定它是否存在(如果是,它是如何不安全/危险的)。该功能按预期工作,但这是不好的做法?我应该担心吗?
我的问题不是重复,因为我询问在函数中使用system()的细节和影响。我的函数允许任何命令行参数以多线程方式传递给系统。
答案 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!!!
当命令由本地命令处理器执行时,它将是不可移植性的源(或者如果用户将其会话配置为使用异常命令处理器,则会出现意外)。
最后,您将启动一个独特的进程,创建一些并非绝对必要的系统开销。