出于安全目的,在bash中清理用户输入

时间:2010-11-25 01:39:34

标签: bash input sanitize

如何在bash脚本中清理用户输入,以便我可以将其作为参数传递给另一个shell程序?我想阻止以下情况:

INPUT="filename;rm -rf /"
ls $INPUT

我认为应该足够用双引号括起用户输入,如下所示:

ls "$INPUT"

但如果$INPUT中有双引号怎么办?

或者bash已经处理过这个问题了?

1 个答案:

答案 0 :(得分:33)

The Short

Bash已经处理过这个问题。引用它就足够了。

ls "$INPUT"

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.

由于引号,$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.

你至少可以得到安慰,这实际上不会执行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

摘自“男子狂欢”:

  

QUOTING

     

引用用于删除shell中某些字符或单词的特殊含义。引用可用于禁用特殊字符的特殊处理,以防止保留字被识别,并防止参数扩展。

     

EXPANSION

     

扩展在分割为单词后在命令行上执行。有七种          执行扩展:支撑扩展,波浪扩展,参数和变量扩展,命令          替换,算术扩展,分词和路径名扩展。

     

只有大括号扩展,单词拆分和路径名扩展才能改变单词的数量          扩张;其他扩展将单个单词扩展为单个单词。唯一的例外是          如上所述"$@""${name[@]}"的扩展(参见参数)。

     

单词拆分

     

shell扫描参数扩展,命令替换和算术扩展的结果          单词分裂的双引号内没有出现。

     

报价删除

     

在前面的扩展之后,所有未加引号的字符\'"都没有出现          上述扩展之一的结果将被删除。