У меня такая же проблема, особенно в плане безопасности, и я нашел решение здесь .
Моя проблема заключалась в том, что я хотел написать сценарий развертывания на 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 путь / к / файлу' Но у этого решения есть некоторая проблема безопасности, потому что исходный файл может содержать все, что может сценарий Bash. Это создает проблемы безопасности. Специалист по malicicios может «выполнить» произвольный код, когда ваш скрипт использует свой конфигурационный файл.
Представьте себе что-то вроде этого:
################### 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