可能存在的风险点:
- 命令注入风险:如果函数参数直接拼接在文件读取命令中,未经过适当的过滤,恶意用户可能通过传入恶意命令,如
; rm -rf /
等,执行非预期的危险操作。例如:cat $1
,若$1
被恶意构造,就会引发命令注入。
- 路径遍历风险:当函数处理文件路径参数时,如果没有对路径进行有效验证,攻击者可能利用
../
等相对路径符号,访问到非预期的文件,泄露敏感信息。比如函数读取用户输入路径的文件,但未检查路径合法性,攻击者传入../../etc/passwd
。
- 文件存在性及权限风险:若函数没有对文件是否存在及文件权限进行合理检查,可能导致读取不存在文件时出现错误,或者在没有权限的情况下尝试读取文件,造成脚本执行异常。例如,直接尝试读取一个没有读取权限的文件。
防范措施:
- 命令注入防范:使用
bash
内置的read
命令的安全特性,如read -r line < <(command)
方式读取文件内容,避免直接将参数拼接到命令中。如果一定要拼接,使用printf
和eval
的安全组合,如printf '%s\n' "$1" | eval "cat"
,并且在eval
之前对$1
进行严格的参数验证,只允许合法字符。
- 路径遍历防范:使用
realpath
命令规范化路径,然后检查规范化后的路径是否在预期的目录范围内。例如:
real_path=$(realpath "$1")
allowed_dir="/expected/directory"
if [[ $real_path != $allowed_dir/* ]]; then
echo "Invalid path"
return 1
fi
- 文件存在性及权限防范:在读取文件前,使用
test
命令或[ ]
条件判断文件是否存在且具有可读权限。例如:
if [ -r "$1" ]; then
cat "$1"
else
echo "File does not exist or is not readable"
return 1
fi