Bash / Shell脚本中的安全输入验证

时间:2016-08-20 19:52:11

标签: linux bash shell ubuntu sanitization

我正在编写一个bash脚本,需要几个用户输入,主要是目录路径和文件名。该程序将创建指定的目录和文件。

在编写目录路径时,我请求绝对路径 - 〜/ DIR /...,或 $ PATH / DIR /... ./DIR /...是不允许的。目录路径应仅以 / DIR / DIR /...的形式提供,文件路径的格式为 / DIR / DIR /.../ filename ,并且文件名以文件名的形式出现。 我还想确保用户没有添加任何命令行选项(例如,如果我运行 sudo ,我想确保用户没有附加 -u 在他们的陈述中的任何地方)他们的意见。

但是,我并不完全确定清理输入的最佳方法,因为目录路径和文件名可能包含短划线,下划线,空格,句点和字母数字字符。应检测任何其他字符。

通过阅读收集用户输入。我正在使用Ubuntu系统,所以只要它符合Ubuntu shell就可以了。 假设只安装了默认的系统包。

可以使用多个选项来处理各个验证部分(例如,使用--将后续数据视为参数而不是命令[由Siguza建议],然后使用另一个选项来处理目录路径。

正确映射目录结构需要绝对路径。由于我在路径字符串上执行的功能,任何其他格式的路径都会导致程序在匹配或附加到其他路径时错误地解释结构。

谢谢。

什么有效:我使用了接受的答案,在某些情况下使用 realpath readlink ,并使用 - 来解释以下文字作为参数。如果要允许相对路径,请使用readlink或realpath的结果作为路径。如果要禁止相对路径,则将原始字符串与readlink或realpath的结果进行比较。

1 个答案:

答案 0 :(得分:2)

你可以这样做:

#!/bin/bash

set -e    

while read path; do
    result=`realpath -m -- "$path"`
    if [ "$result" != "$path" ] && [ "$result/" != "$path" ] ; then
        echo "Rejected: $path"
    else
        last_char_index=$((${#path}-1))
        last_char=${path:$last_char_index:1}
        if [ "$last_char" == "/" ]; then
            echo "New directory: $path"
            mkdir -- "$path"
        else
            echo "New file: $path"
            touch -- "$path"
        fi
    fi
done

exit 0

我使用realpath来捕获相对路径,然后总是在双引号之间使用用户输入以避免命令注入(如果可能的话)。 我想有更好的方法,但目前这是我能想到的全部。

编辑:根据评论中的建议,我添加了--以确保文件/目录名称安全地提供给touchmkdirrealpath