关于我的申请的一点点:
我正在用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接受。
答案 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
_
)-
).
)a-z
或A-z
或0-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