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

标签 c++ windows multithreading system

<分区>

我有一个程序,我需要先执行 .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 配置为使用不寻常的命令处理器,则会令人惊讶)。

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

关于C++ 在公共(public)函数中使用 system() 安全还是不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38151105/

相关文章:

c++ - 在使用 boost::assign::list_of 时声明时不能被非常量表达式初始化

仅用于文件大小的 Windows 命令

c++ - c++中+=运算符的线程安全

java - 如何终止由于Socket.accept()而被阻塞太长时间的线程?

涉及私有(private)继承的 C++ 编译器错误

c++ - Json cpp asCstring() 存储在变量中时返回空 cstring

c++ - 为什么我不需要取消引用 char 指针来输出 c 风格的字符串?

Windows 10 - 如何在没有触摸屏的情况下测试触摸事件?

c++ - Cygwin+ eclipse : How does one hide a console window in n OpengGL based program by without getting unrecognized emulation mode error?

java - ObjectPool 的堆栈或链表?