2016-08-20 97 views
0

我正在写一个bash脚本,它需要几个用户输入,主要是目录路径和文件名。该程序将创建指定的目录和文件。在Bash/Shell脚本中的安全输入验证

当写的目录路径,我要求绝对路径 - 〜/ DIR/...,或$ PATH/DIR/..../DIR/...不准。目录路径只应以/DIR/DIR/...的形式提供,文件路径格式为/DIR/DIR/.../filename,文件名格式为,文件名为。 我也想确保用户没有添加任何命令行选项(例如,如果我运行sudo,我想确保用户没有在他们的输入中的任何地方附加-u)。

但是,由于目录路径和文件名可能包含破折号,下划线,空格,句点和字母数字字符,因此我并不完全确定清理其输入的最佳方式。任何其他角色都应该被检测到。

用户输入通过收集读取。我使用的是Ubuntu系统,只要符合Ubuntu shell,它就可以工作。 假设只安装了默认的系统软件包。

多个选项是可以接受的,以处理验证的各个部分(例如,使用--治疗下列数据作为用于处理目录路径的参数,而不是一个命令[由Siguza建议],然后另一种选择)。

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

谢谢。


什么工作:我以前接受的答案,用在某些情况下的真实路径的readlink,并使用-解释下面的文本作为参数。如果你想允许相对路径,那么使用readlink或realpath的结果作为你的路径。如果您想禁止相对路径,请将原始字符串与readlink或实时路径的结果进行比较。

+3

大多数命令都支持“ - ”选项,这使得它们将所有以下参数视为参数,而不是选项/标志。除此之外,将所有变量用双引号括起来以避免扩展。 – Siguza

+0

虽然这确实处理了前两个问题,但用户仍然可以使用我的程序无法接受的格式整个目录路径。我或者需要拒绝无效输入,或者将其符合有效输入。 –

+0

回复:“用户可以使用我的程序无法接受的格式存放整个目录路径,我需要拒绝无效输入,或将其符合有效输入”:*或*您可以更改程序以接受此类格式。 。 。 – ruakh

回答

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

+2

引用变量不会阻止它们被解析为选项。用'--'来表示。 – Siguza

+0

@Siguza你能否提供一个这个脚本不安全的例子? – yoones

+2

我从来没有说过它是可以被利用的,但是你可以设置path ='-X'并且在一个无效的选项上有实际的路径崩溃。你也应该'设置-e;',否则你可以设置path ='''',因为错误信息打印到stderr而不是stdout,实际路径会崩溃,但是'else'块会被执行。再次,不可开发,但可能不可取。 – Siguza