使用常量字符串调用 system(3) 或 popen(3) 的陷阱?

使用常量字符串调用 system(3) 或 popen(3) 的陷阱?

假设您显式设置了“有问题的”环境变量,例如PATHIFS,以及可能的某些变量,那么使用and与值为编译时常量的字符串(以允许之间存在差异)LC_*是多么糟糕的想法Unices 和像非 POSIX那样的怪异)。popensystem/bin/sh

例如,如果我有一些 C 代码使用如下所示的代码片段对当前目录中的文件执行深度优先搜索,那么从安全性/正确性的角度来看,这是一个问题吗?

FILE* fh = popen("2>/dev/null /usr/bin/find . -print0 -type f");

编辑:强制清洁环境且不包括不可移植选项的示例

FILE* fh = popen("2>/dev/null /usr/bin/env -i /usr/bin/find . -type f");

答案1

假设您明确设置了“有问题的”环境变量,例如......

不要那样做。

识别某个程序可能关心的所有环境变量有点困难。为程序提供一个干净的环境,仅设置必要的变量会更容易一些。

如果您正在运行这样的简单命令,只需使用其中一个函数即可exec,因此您无需关心有关不同 shell 的问题。

如果您知道您正在调用一个标准实用程序,那么您可以非常确定您知道它在做什么,并且如果您要自己实现该函数,任何资源限制等也可能会影响您的程序。但是有一些find带有非标准扩展的变体,就像-print0您使用的一样,因此如果您使用它们,则取决于支持它们的外部程序的版本。

相关内容