Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有没有办法防止sh/bash执行命令替换?_C_Bash_Embedded Linux_Sh - Fatal编程技术网

C 有没有办法防止sh/bash执行命令替换?

C 有没有办法防止sh/bash执行命令替换?,c,bash,embedded-linux,sh,C,Bash,Embedded Linux,Sh,从一个C程序中,我想调用一个以文件名为参数的shell脚本。用户可以控制文件名。C类似于(省略初始化/错误检查): 目标设备实际上是一个嵌入式系统,所以我不需要担心恶意用户。显然,这将是一个Web环境中的攻击向量。但是,如果系统上有一个文件名,例如,其名称中包含反引号,则该命令将失败,因为shell将对该名称执行扩展。是否有任何方法可以防止命令替换?尝试在系统函数中触发“unalias”。好的,您可以通过调用fork()然后调用execv()来重新实现system() 既然您将此标记为C,我将为

从一个C程序中,我想调用一个以文件名为参数的shell脚本。用户可以控制文件名。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);