在Linux平台上,我有C ++代码,如下所示:
// ...
std::string myDir;
myDir = argv[1]; // myDir is initialized using user input from the command line.
std::string command;
command = "mkdir " + myDir;
if (system(command.c_str()) != 0) {
return 1;
}
// continue....
感谢。
答案 0 :(得分:10)
请勿使用system
。喜欢execl
。
execl ("/bin/mkdir", "mkdir", myDir, (char *)0);
这样,myDir
总是作为单个参数传递给mkdir
,并且不涉及shell。请注意,如果您使用此方法,则需要fork
。
但如果这只是一个例子,你应该使用mkdir
C函数:
mkdir(myDir, someMode);
答案 1 :(得分:2)
使用system()调用命令行参数而不清理输入可能是非常不安全的。
潜在的安全威胁可能是用户将以下内容作为目录名传递
somedir ; rm -rf /
为防止这种情况,请使用以下
的混合物最好的选择是使用全部三个
答案 2 :(得分:0)
除了Matthew的回答,除非你绝对需要,否则不要生成shell进程。如果使用fork / execl组合,则永远不会解析单个参数,因此不需要进行转义。请注意空字符,但仍然会提前终止参数(在某些情况下这不是安全问题)。
我认为mkdir只是一个例子,因为mkdir可以比这些子进程建议更容易从C ++中调用。