2011-04-15 67 views
2

我正在实现wordexp函数,该函数需要识别并可选地拒绝命令替换(即$(...)或反引号)的出现,并且从质量角度来看,还应该识别和拒绝未引用每当命令替换被禁用时,特殊字符|,&,;,<>的发生。在shell命令文本中识别未加引号的特殊字符

我在寻找的是一种简单的方法来识别这些特殊字符的存在,而不需要重复大量的shell逻辑。有任何想法吗?

一旦串被验证,我将它传递给sh有以下-c说法:

printf '%s\0' [string inserted here] 

它建立一个很好的多串准备用C代码消耗。

+0

wordexp的重点在于集中执行其功能所需的shell逻辑的重复。由于人们寻找简单的广告解决方案而造成的众多安全破坏,表明认识到特殊角色的位置被解释为特殊并不容易。 – AProgrammer 2011-04-15 13:09:19

+0

我没有要求一个近似解决方案,只是一个简单的解决方案。 – 2011-04-15 13:24:31

回答

0

这种做法似乎是正确的,但我希望能改正,如果它是错的:

如果没有指定WRDE_NOCMD标志,没有做任何检查。为wordexp规范说,应用

应保证也就是说不包含未加引号字符或任何未加引号shell特殊字符的...

而且肯定是有从检查获得无安全利益在已经允许命令替换的命令替换上下文之外伪造特殊字符。

现在,如果指定了WRDE_NOCMD,则按顺序处理该字符串,并保留一个标志,以确定我们是处于单引号还是双引号的上下文中。

  • 在非单引号的上下文中遇到反斜杠会跳过下一个字符。
  • 在非双引号的上下文中遇到单引号会切换单引号上下文。
  • 在非单引号上下文中遇到双引号会切换双引号上下文。
  • 在非单引号的上下文中遇到反引号或$(后面紧接着不是另一个(导致WRDE_CMDSUB
  • 在非引用的上下文中遇到任何特殊字符导致WRDE_BADCHAR

因为我们要禁止所有的命令替换,没有嵌套$(上下文的后顾之忧;进入第一级已经产生错误。

我在这里犯了什么愚蠢的(或微妙的和不那么愚蠢的)错误吗?

+0

一个问题:它不允许'$((...))'算术。 :-(解决这个问题似乎并不难,但需要保留括号内的数量,并将内部区域视为类似双引号的上下文。 – 2011-04-15 15:22:07