1

简单的方法:

# 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    

如何更安全地做到这一点(允许一些扩展,但没有实际执行配置文件中的命令)。“安全”应该防止偶尔将错误的片段插入配置,而不是防止特制的攻击。

4

2 回答 2

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,但这是您可以做的限制。

于 2012-09-07T16:53:25.197 回答
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 文件运行“可接受”行。上面的模式过滤了所有看起来不像由大写字母和数字字符组成的变量的简单赋值的行。更高级的正则表达式可以允许更多的情况或灵活性。上面的 RS 表示忽略尾随引号。FS 说,如果在 = 之后有一个引号,那么它会被忽略。FS/RS 组合导致从值中去除引号。输出仅转换为语句,例如export VAR="VALUE".

This does not protect from "attacks" as the value is not parsed at all, but such filtering could be added easily enough.

于 2012-09-07T18:49:33.660 回答