我正在实现 wordexp
函数,它需要识别并有选择地拒绝出现的命令替换(即 $(...)
或反引号),并且从质量的角度来看,它还应该识别并拒绝出现的特殊字符 |
未加引号。 , &
, ;
, <
, 和 >
每当禁用命令替换时。
我正在寻找一种简单的方法来识别这些特殊字符的存在,而无需重复大量的 shell 逻辑。有什么想法吗?
验证字符串后,我将其传递给 sh
与以下 -c
参数:
printf '%s\0' [string inserted here]
它构建了一个很好的多字符串,可供 C 代码使用。
最佳答案
这种做法似乎是正确的,但如果不对,欢迎指正:
如果未指定 WRDE_NOCMD
标志,则不进行任何检查。 wordexp
的规范说明了应用程序
shall ensure that words does not contain an unquoted character or any of the unquoted shell special characters ...
而且当已经允许命令替换时,在命令替换上下文之外检查伪造的特殊字符肯定不会带来安全优势。
现在,如果指定了 WRDE_NOCMD
,则按顺序处理字符串,并保留一个标志以表明我们是在单引号还是双引号上下文中。
- 在非单引号上下文中遇到反斜杠会跳过下一个字符。
- 在非双引号上下文中遇到单引号会切换单引号上下文。
- 在非单引号上下文中遇到双引号会切换双引号上下文。
- 遇到反引号,或者
$(
后面没有紧接着另一个(
,在非单引号上下文中会导致WRDE_CMDSUB
. - 在非引号上下文中遇到任何特殊字符会导致
WRDE_BADCHAR
。
由于我们将禁止所有命令替换,因此无需担心嵌套的 $(
上下文;进入第一级已经产生错误。
我在这里犯过任何愚蠢(或微妙但不那么愚蠢)的错误吗?
关于c - 识别 shell 命令文本中未加引号的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5676919/