我在安全性cas方面有同样的问题,我在这里找到了解决方案。
我的问题是,我想在bash中编写一个包含配置文件的部署脚本,该配置文件包含这样的路径。
################### Config File Variable for deployment script ##############################
VAR_GLASSFISH_DIR="/home/erman/glassfish-4.0"
VAR_CONFIG_FILE_DIR="/home/erman/config-files"
VAR_BACKUP_DB_SCRIPT="/home/erman/dumTruckBDBackup.sh"
现有的解决方案包括使用“ SOURCE”命令并使用这些变量导入配置文件。'SOURCE path / to / file'但是此解决方案存在一些安全问题,因为源文件可以包含Bash脚本可以包含的任何内容。这就产生了安全问题。当您的脚本采购其配置文件时,恶意人员可以“执行”任意代码。
想象这样的事情:
################### Config File Variable for deployment script ##############################
VAR_GLASSFISH_DIR="/home/erman/glassfish-4.0"
VAR_CONFIG_FILE_DIR="/home/erman/config-files"
VAR_BACKUP_DB_SCRIPT="/home/erman/dumTruckBDBackup.sh"; rm -fr ~/*
# hey look, weird code follows...
echo "I am the skull virus..."
echo rm -fr ~/*
为了解决这个问题,我们可能希望只允许NAME=VALUE
该文件中的形式的构造(变量赋值语法),也可能只允许注释(尽管从技术上讲,注释并不重要)。因此,我们可以使用以下egrep
命令来检查配置文件:grep -E
。
这就是我解决问题的方式。
configfile='deployment.cfg'
if [ -f ${configfile} ]; then
echo "Reading user config...." >&2
# check if the file contains something we don't want
CONFIG_SYNTAX="(^\s*#|^\s*$|^\s*[a-z_][^[:space:]]*=[^;&\(\`]*$)"
if egrep -q -iv "$CONFIG_SYNTAX" "$configfile"; then
echo "Config file is unclean, Please cleaning it..." >&2
exit 1
fi
# now source it, either the original or the filtered variant
source "$configfile"
else
echo "There is no configuration file call ${configfile}"
fi