source
не є безпечним, оскільки він буде виконувати довільний код. Це може не турбувати вас, але якщо права доступу до файлів невірні, зловмисник з доступом до файлової системи може виконати код як привілейований користувач, ввівши код у файл конфігурації, завантажений іншим чином захищеним сценарієм, таким як сценарій init.
Поки що найкраще рішення, яке мені вдалося визначити, - це незграбне рішення винахідництва колеса:
myscript.conf
password=bar
echo rm -rf /
PROMPT_COMMAND='echo "Sending your last command $(history 1) to my email"'
hostname=localhost; echo rm -rf /
Використовуючи source
це, він би запустився echo rm -rf /
двічі, а також змінив працюючого користувача $PROMPT_COMMAND
. Натомість зробіть це:
myscript.sh (Bash 4)
#!/bin/bash
typeset -A config # init array
config=( # set default values in config array
[username]="root"
[password]=""
[hostname]="localhost"
)
while read line
do
if echo $line | grep -F = &>/dev/null
then
varname=$(echo "$line" | cut -d '=' -f 1)
config[$varname]=$(echo "$line" | cut -d '=' -f 2-)
fi
done < myscript.conf
echo ${config[username]} # should be loaded from defaults
echo ${config[password]} # should be loaded from config file
echo ${config[hostname]} # includes the "injected" code, but it's fine here
echo ${config[PROMPT_COMMAND]} # also respects variables that you may not have
# been looking for, but they're sandboxed inside the $config array
myscript.sh (Mac / Bash 3-сумісний)
#!/bin/bash
config() {
val=$(grep -E "^$1=" myscript.conf 2>/dev/null || echo "$1=__DEFAULT__" | head -n 1 | cut -d '=' -f 2-)
if [[ $val == __DEFAULT__ ]]
then
case $1 in
username)
echo -n "root"
;;
password)
echo -n ""
;;
hostname)
echo -n "localhost"
;;
esac
else
echo -n $val
fi
}
echo $(config username) # should be loaded from defaults
echo $(config password) # should be loaded from config file
echo $(config hostname) # includes the "injected" code, but it's fine here
echo $(config PROMPT_COMMAND) # also respects variables that you may not have
# been looking for, but they're sandboxed inside the $config array
Будь ласка, дайте відповідь, якщо ви знайдете в моєму коді подвиг безпеки.