C 有没有办法防止sh/bash执行命令替换?
从一个C程序中,我想调用一个以文件名为参数的shell脚本。用户可以控制文件名。C类似于(省略初始化/错误检查):C 有没有办法防止sh/bash执行命令替换?,c,bash,embedded-linux,sh,C,Bash,Embedded Linux,Sh,从一个C程序中,我想调用一个以文件名为参数的shell脚本。用户可以控制文件名。C类似于(省略初始化/错误检查): 目标设备实际上是一个嵌入式系统,所以我不需要担心恶意用户。显然,这将是一个Web环境中的攻击向量。但是,如果系统上有一个文件名,例如,其名称中包含反引号,则该命令将失败,因为shell将对该名称执行扩展。是否有任何方法可以防止命令替换?尝试在系统函数中触发“unalias”。好的,您可以通过调用fork()然后调用execv()来重新实现system() 既然您将此标记为C,我将为
目标设备实际上是一个嵌入式系统,所以我不需要担心恶意用户。显然,这将是一个Web环境中的攻击向量。但是,如果系统上有一个文件名,例如,其名称中包含反引号,则该命令将失败,因为shell将对该名称执行扩展。是否有任何方法可以防止命令替换?尝试在系统函数中触发“unalias”。好的,您可以通过调用fork()然后调用execv()来重新实现system()
既然您将此标记为C,我将为您提供C答案。您将需要转义文件名——创建一个新字符串,该字符串将被shell正确处理,以便像
这是一个文件名
这样的事情产生这是\a\file\name
或坏;rm*;文件名
变为坏\;rm\\*\;文件名
。然后你可以把它传给贝壳
另一种解决方法是使用
fork
和一个exec
函数直接运行shell。直接向程序传递参数不会导致shell命令行扩展或解释。正如sharth所说,您不应该使用system
,而应该自己使用fork
和execv
。但要回答如何使字符串安全地传递到shell的问题(如果坚持使用系统
),需要对字符串进行转义。最简单的方法是首先用'\'
(单引号)替换'\'
(单引号、反斜杠、单引号、单引号),然后在字符串的开头和结尾添加'
(单引号)。另一个相当简单(但效率通常较低)的方法是在每个字符前放置反斜杠,但仍然需要执行一些特殊的引号技巧来处理嵌入的换行符,因此我更喜欢第一种方法。使用单引号”
。Bash不会取代这一点。即sprintf(buf,“/bin/sh script.sh'%s',文件名)代码>。那么一切都取决于script.sh
在做什么。您可能还希望为受限shell指定-r
,但在此类shell中可以执行的操作存在一些限制,有关详细信息,请参阅bash手册页面的受限shell
部分。
sprintf(buf, "/bin/sh script.sh \"%s\"", filename);
system(buf);