C ++:如何为安全系统调用转义用户输入?

时间:2010-08-29 11:22:53

标签: c++ linux security escaping

在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....
  • 将用户输入传递给system()调用安全吗?
  • 是否应对用户输入进行转义/清理?
  • 如何?
  • 上述代码如何被用于恶意目的?

感谢。

3 个答案:

答案 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 /

为防止这种情况,请使用以下

的混合物
  • 使用getopt确保输入 消毒
  • 清理输入
  • 使用execl而不是system来执行 命令

最好的选择是使用全部三个

答案 2 :(得分:0)

除了Matthew的回答,除非你绝对需要,否则不要生成shell进程。如果使用fork / execl组合,则永远不会解析单个参数,因此不需要进行转义。请注意空字符,但仍然会提前终止参数(在某些情况下这不是安全问题)。

我认为mkdir只是一个例子,因为mkdir可以比这些子进程建议更容易从C ++中调用。