我有一个程序,我需要先执行 .exe 将图像转换为 DDS,然后才能在我的程序中使用它们。为此,我有一个函数,我可以像这样将命令传递给 system():
unsigned int __stdcall Scene::ExecuteCommand(void* command)
{
return system(static_cast<char*>(command));
}
前几天我在想,这可能是不安全/危险的,但我不是 100% 确定它是否是(如果是,它是如何不安全/危险的)。该功能按预期工作,但这是不好的做法吗?我应该担心吗?
我的问题不是重复的,因为我问的是在函数内部使用 system() 的细节和影响。我的函数允许以多线程方式将任何命令行参数传递给系统。
这是一种相对不安全的做法:如果使用未经检查的参数调用此函数,则有可能成为漏洞的来源。
示例:
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!!!
由于命令由本地命令处理器执行,它将成为不可移植性的来源(或者如果用户将其 session 配置为使用不寻常的命令处理器,则会令人惊讶)。
最后,您将启动一个不同的进程,创建一些并非绝对必要的系统开销。