ฉันมีปัญหาเดียวกันโดยเฉพาะในเรื่องความปลอดภัยและฉันพบวิธีแก้ปัญหาที่นี่ที่นี่
ปัญหาของฉันคือว่าฉันต้องการที่จะเขียนสคริปต์การใช้งานในทุบตีกับไฟล์ config ที่เนื้อหาบางเส้นทางเช่นนี้
################### 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" และนำเข้าไฟล์ config ด้วยตัวแปรเหล่านี้ 'SOURCE path / to / file' แต่วิธีนี้มีปัญหาด้านความปลอดภัยเนื่องจากไฟล์ที่มาสามารถมีสิ่งที่สคริปต์ 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
ในไฟล์นั้น (ไวยากรณ์การกำหนดตัวแปร) และอาจแสดงความคิดเห็น (แม้ว่าในทางเทคนิคแล้วความคิดเห็นจะไม่สำคัญ) ดังนั้นเราสามารถตรวจสอบไฟล์ config โดยใช้คำสั่งเทียบเท่าของ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