Ho lo stesso problema specialmente in caso di sicurezza e ho trovato la soluzione qui .
Il mio problema era che volevo scrivere uno script di distribuzione in bash con un file di configurazione che contenesse un percorso come questo.
################### 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"
Una soluzione esistente consiste nell'utilizzare il comando "SOURCE" e importare il file di configurazione con queste variabili. 'Percorso SOURCE / to / file' Ma questa soluzione presenta alcuni problemi di sicurezza, poiché il file di origine può contenere qualsiasi cosa che uno script Bash può contenere. Ciò crea problemi di sicurezza. Una persona malintenzionata può "eseguire" codice arbitrario quando lo script sta cercando il suo file di configurazione.
Immagina qualcosa del genere:
################### 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 ~/*
Per risolvere questo problema, potremmo voler consentire solo i costrutti nel modulo NAME=VALUE
in quel file (sintassi di assegnazione variabile) e forse i commenti (anche se tecnicamente, i commenti non sono importanti). Quindi, possiamo controllare il file di configurazione usando il egrep
comando equivalente di grep -E
.
Ecco come ho risolto il problema.
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