如何更安全地阅读bash脚本式配置?

时间:2012-09-07 15:31:56

标签: bash config

简单方法:

# Read environment from config file

set -o allexport
source my_config_file.conf
set +o allexport

配置文件的格式如下:

VAR1=eee
VAR2="dsfsdf sd fsdf"
VAR3=$VAR1
# comment    

如何更安全地做到这一点(允许一些扩展,但没有在配置文件中实际执行命令)。 &#34;安全&#34;应防止偶尔将错误的片段插入配置,而不是来自特制的攻击。<​​/ p>

2 个答案:

答案 0 :(得分:3)

VAR1=eee是一个命令,你要停止哪些命令?我们假设它是外部程序。

一种方法是废弃PATH:

oldPATH="$PATH"
PATH=
set -o allexport 
source /full-path-name/my_config_file.conf 
set +o allexport 
PATH="$oldPATH"

但是等等!命令是“哈希”的,因此您还需要先清除哈希值,因此请添加hash -r。 您可能还需要清除别名,例如ls通常是别名。

通过提供命令的完整路径名称(例如/usr/bin/man)可以轻松地实现这一目标,但这与您可以执行的操作的限制有关。

答案 1 :(得分:0)

如果你想限制.conf文件只允许一些允许的模式,你可以做以下几点:

eval `awk -v FS="=[\"]*" -v RS="[\"]*\n" '/^[A-Z0-9]+=/ { printf("export %s=\"%s\"; ", \$1, \$2); }' my_config_file.conf`;

awk scriptlet中的正则表达式可以是^((VAR1)|(VAR2)|(VAR3))=的灵活或严格的。

.仍然用于“运行”分配,但只有“可接受”的行从.conf文件运行。上面的模式过滤所有看起来不像是由大写字母和数字字符组成的变量的简单赋值的行。 Fancier正则表达式可以允许更多的情况或灵活性。上面的RS意味着忽略尾随引号。 FS表示,如果引号跟随=,那么它将被忽略。 FS / RS组合导致从值中删除引号。输出仅转换为export VAR="VALUE"等语句。

这不能防止“攻击”,因为根本没有解析该值,但是这样的过滤可以很容易地添加。