我正在运行一个命令,该命令提供一个字符串作为输出,我使用popen()在C代码中读取该字符串。
我传递给popen()的命令如下:
mypipe = popen("some_cmd | awk '{print $2}'", "r");
从本质上讲,这使它更简单,避免了在C语言中进行进一步的语法分析。我担心在这里这样做是否正确。当然,我也可以用awk:
mypipe = popen("some_cmd", "r");
然后使用strtok()解析我想要的字符串。
我的问题是,考虑到我无论如何都要运行一个外部命令(使用popen()),使用awk(或类似的)来解析管道输出是否被认为是不安全的,如上面的示例所示。会不会有什么问题?
最佳答案
运行任何“外部命令”都是一个小风险。风险有多大取决于您的应用程序在做什么,谁有权访问该应用程序,以及他们对机器的访问权限。主要的问题是,用户可能会通过将“命令”替换为其他操作来规避系统安全性[或“您所期望的和其他操作]。如果应用程序具有常规用户不具有的权限(或对常规用户不具有的某些权限的访问权限),并且派生进程继承了这些权限,则这将成为一个更大的问题。
在已经运行的内容上添加awk
并不能真正改变该帐户上的内容-如果用户可以改变awk
的功能(通常是将另一个名为awk
的程序放在实际awk
之前的位置),那么用户也可以使用some_cmd
来完成。
它实际上可以归结为“一个人能做什么他们已经做不到”和“什么损害/利益可能是这样的结果”。如果你在银行工作,而这个应用程序的用户可以转移大笔资金(或者取少量资金并将其累积到某个账户中),或者你的代码正在保护核导弹,那么你可能需要仔细考虑这可能会导致什么后果。
另一方面,如果这是在一个人的机器上运行的话,通常情况下他们对机器的访问几乎是完全的,而且机器不是一个可能会受到外国用户攻击的公共Web服务器,那么风险是很小的,对吧?