joh*_*hnf 29 bash input sanitize
如何在bash脚本中清理用户输入,以便我可以将其作为参数传递给另一个shell程序?我想阻止以下情况:
INPUT="filename;rm -rf /"
ls $INPUT
Run Code Online (Sandbox Code Playgroud)
我认为它应该足以用双引号括起用户输入,如下所示:
ls "$INPUT"
Run Code Online (Sandbox Code Playgroud)
但如果有双引号$INPUT
怎么办?
或者bash已经处理过这个问题了吗?
Joh*_*ica 37
Bash已经处理过这个问题.引用它就足够了.
ls "$INPUT"
Run Code Online (Sandbox Code Playgroud)
shell解析此行的粗略指南是:
"ls \"$INPUT\"" # Raw command line.
["ls", "\"$INPUT\""] # Break into words.
["ls", "\"filename; rm -rf /\""] # Perform variable expansion.
["ls", "\"filename; rm -rf /\""] # Perform word splitting (no change).
["ls", "filename; rm -rf /"] # Remove quotes.
Run Code Online (Sandbox Code Playgroud)
由于引号,$INPUT
变量不会进行单词拆分.该ls
会寻找一个名为文件filename; rm -rf /
.
如果你没有引用它,那么扩展将以不同的方式进行:
"ls $INPUT" # Raw command line.
["ls", "$INPUT"] # Break into words.
["ls", "filename; rm -rf /"] # Perform variable expansion.
["ls", "filename;", "rm", "-rf", "/"] # Perform word splitting.
Run Code Online (Sandbox Code Playgroud)
你至少可以得到这种实际上不会执行的安慰rm -rf /
.相反,它会将每个字符串作为文件名传递给ls
.你会有ls
一些你不想要的文件,但至少它不会意外地执行不需要的命令.
jkugelman$ VAR='.; echo hi'
jkugelman$ ls $VAR
ls: .;: No such file or directory
ls: echo: No such file or directory
ls: hi: No such file or directory
Run Code Online (Sandbox Code Playgroud)
摘自"man bash":
QUOTING
引用用于删除shell中某些字符或单词的特殊含义.引用可用于禁用特殊字符的特殊处理,以防止保留字被识别,并防止参数扩展.
扩张
在将命令行拆分为单词后,将在命令行上执行扩展.执行了七种扩展:大括号扩展,波浪扩展,参数和变量扩展,命令替换,算术扩展,单词拆分和路径名扩展.
只有大括号扩展,分词和路径名扩展才能改变扩展的单词数量; 其他扩展将单个单词扩展为单个单词.唯一的例外是上面的解释
"$@"
和扩展"${name[@]}"
(参见参数).单词分裂
shell扫描参数扩展,命令替换和算术扩展的结果,这些结果在双引号内没有出现用于分词.
报价删除
在前面的扩展之后,将删除所有未加引号出现的字符
\
,'
以及"
不是由上述扩展之一产生的字符.