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

Posted

技术标签:

【中文标题】出于安全目的,在 bash 中清理用户输入【英文标题】:Sanitize user input in bash for security purposes 【发布时间】:2011-05-15 10:58:05 【问题描述】:

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

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

我认为将用户输入用双引号括起来就足够了,如下所示:

ls "$INPUT"

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

或者 bash 是否已经解决了这个问题?

【问题讨论】:

【参考方案1】:

短片

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

摘自“man bash”:

报价

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

扩展

在被拆分成单词后在命令行上执行扩展。有七种 执行的扩展:大括号扩展、波浪号扩展、参数和变量扩展、命令 替换、算术扩展、分词和路径名扩展。

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

分词

shell 扫描参数扩展、命令替换和算术扩展的结果 没有出现在双引号中以进行分词。

引号删除

在前面的扩展之后,所有未引用的字符 \'" 上述扩展之一的结果被删除。

【讨论】:

好电话,但需要注意的是,这不适用于eval 请注意,4.0 之前的 bash 在波浪号扩展时执行通配符(尽管没有拆分),除了使用临时变量(或使用 set -f 完全禁用通配符)外,没有办法避免这种情况。 还要注意,一般来说,如果你不打算列出目录的内容,你应该做ls -- "$INPUT"ls -d -- "$INPUT" 我知道,旧帖,但是 - eval 是一个重要案例。如果他们执行eval ls $INPUT,“rm”命令将被执行。如果涉及到 eval,那么反引号和$(cmd) 子表达式也是可能的威胁。

以上是关于出于安全目的,在 bash 中清理用户输入的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?

如何检测用户在 iOS 中使用了语音输入?

何时最好清理用户输入?

解析Linux中的系统安全及应用

SQL Server:出于数学目的,如何仅选择带有度量单位的数字[重复]

在 PHP 中清理用户定义的 CSS