如何在bash脚本中验证文件名?

时间:2013-08-16 22:15:41

标签: bash validation filenames

关于我的申请的一点点:

我正在用bash脚本编写一个小应用程序。应用程序必须将个人设置存储到主目录。

我的设置采用键/值对的形式,将存储为文件名/内容:

for example:
~/my-github-app
    ├── github-account
    ├── github-token

我目前添加键/值的解决方案:

read KEY
read VALUE
# FIXME! should check for for valid filename.
#        user can do injection hack by KEY="../../path/to/yourfile"
echo $VALUE > ~/my-github-app/$KEY

验证$ KEY的最简单,最安全的方法是什么?

  • 内置功能?
  • 正则表达式?

我真的需要一个可重用的解决方案,而不仅仅是这个应用程序。

编辑:

“验证文件名”表示检查字符串是否为适当的文件名格式,由OS接受。

  • “bob”:良好的文件名格式
  • “”:错误因为文件名不能为空
  • “*”:?
  • “/”:?
  • “con”:? ....

4 个答案:

答案 0 :(得分:5)

确保安全的唯一方法是使用白名单。这意味着不是将不良角色列入黑名单,而是允许使用好的角色。黑名单总是会失败的原因是你不能将所有奇怪的人列入黑名单,你总会忘记一些事情。特别是如果你正在使用unicode字符串。

文件名可以包含任何内容。根据维基百科:

  

文件名中的Ext4允许字符:除NUL('\ 0')和'/'之外的所有字节

这意味着整个bash脚本可以是有效的文件名。 所以,如果我是你,我只允许a-zA-Z作为有效字符。问题解决了。

你就是这样做的:

# if [[ $key =~ [^a-zA-Z] ]]; then # or this. Whatever makes more sense to you
if ! [[ $key =~ ^[a-zA-Z]+$ ]]; then
    echo 'Wrong key. Only a-zA-Z characters are allowed' >&2 # write to stderr
    exit 1
fi

答案 1 :(得分:2)

除了@ Aleks-Daniel Jakimenko-A。的回答,在脚本检查以下条件之后,如果设置了所有条件,则返回True

  • a-z
  • A-Z
  • 0-9
  • 下划线(_
  • 破折号(-
  • 期间(.
  • 最大长度为255
  • 首字母应为字符或数字:{a-zA-z0-9}

myScript.sh:

#!/bin/bash
# To run: bash myScript.sh <myStringIs>

key=$1
# String's length check
val=$(echo "${#key}")
if [ $val -gt 255 ];
   then echo "False"; exit
fi

# Is valid characters exist
if ! [[ $key =~ ^[0-9a-zA-Z._-]+$ ]]; then
    echo 'False'; exit
fi    

# First character check
key=$(echo $key | cut -c1-1)
if ! [[ $key =~ ^[0-9a-zA-Z]+$ ]]; then
    echo 'False'; exit
fi

echo 'True';

答案 2 :(得分:0)

您想验证什么,只是一个键不包含任何路径信息?

KEY=$(basename $KEY) 

这将删除作为路径一部分的KEY的任何部分。也就是说,用户可以输入很多东西,这可能是一个坏主意。您是否可以拥有允许密钥列表,然后拒绝该列表中的任何内容?

如果您正在尝试查看文件是否可写,则可以检查a)是否存在且可写(-w)或b)只是尝试写入并检查错误。

答案 3 :(得分:0)

如果您只想检查文件是否已存在,请使用test命令并将其用于验证:

if [[ ! -e "$KEY" ]]
then
    #file doet not exists
fi