0

我正在运行一个命令,它提供一个字符串作为输出,我使用 popen() 在我的 C 代码中读取该字符串。

我传递给 popen() 的命令是这样的:

mypipe = popen("some_cmd | awk '{print $2}'", "r");

从本质上讲,这使它更简单,并避免在 C 中进一步解析。我担心在这里做这件事是否正确。当然,我可以用 awk 做同样的事情:

mypipe = popen("some_cmd", "r");

然后使用 strtok() 来解析我想要的字符串。

我的问题是,考虑到无论如何我都要运行外部命令(使用 popen()),使用 awk(或类似的)来解析管道输出是否被认为是不安全的,如上面的示例所示。它会引起任何问题吗?

4

1 回答 1

2

运行任何“外部命令”都有轻微的风险。风险有多大取决于您的应用程序在做什么,谁可以访问该应用程序以及他们对机器的访问权限。主要问题是,用户可能会通过将“命令”替换为执行除此之外的某些操作[或“您的期望和其他操作”] 来规避系统安全性。如果您的应用程序拥有普通用户没有的权限(或访问普通用户没有的权限)并且生成的进程继承了这些权限,这将成为一个更大的问题。

awk在您已经运行的内容之上添加并不会真正改变该帐户上的内容 - 如果用户可以更改所做的事情awk(通常通过将另一个名为awk的程序放置在 real 之前的位置awk),那么用户可能可以做那some_cmd也太。

它真的归结为“某人可以做他们已经不能做的事情”和“结果可能是什么损害/利益”。如果您在银行工作,并且此应用程序的用户可能会转移大笔资金(或取少量并将其累积到某个地方的帐户中),或者您的代码正在保护核导弹,您可能需要仔细考虑这可能导致。

另一方面,如果这是在一个人的机器上运行,通常他们无论如何都可以完全访问该机器,并且该机器不是可能被外国用户攻击的公共网络服务器,那么风险很小,对吧?

于 2013-04-17T10:56:25.023 回答