繁体   English   中英

防止从Bash中的源文件执行命令

[英]Prevent a command being executed from a source'd file in Bash

为了安全起见,如何防止source d文件中的命令被执行? 例如:

#!/bin/sh
source file.cfg

通缉:

get="value"

意外的:

command

长话短说,你不能。 我们可以辩论如何尝试阻止执行某些命令,但是如果安全是此处的主要考虑因素,那么source是不可行的。 您正在寻找一种适当的配置工具,而source是用来执行代码的

例如,以下代码提供了简单的键值配置文件解析:

while read -r x; do
    declare +x -- "${x}"
done < file.cfg

但这既不是灵活性source提供的,也不是完全安全的解决方案。 它不处理任何特定的转义,多行变量,注释…,并且也不过滤分配的变量,因此配置可以覆盖您的宝贵变量。 declare的额外+x参数可确保配置文件至少不会修改导出到程序的环境。

如果您确实想走这条路,则可以尝试改善这一点。 但是,如果您真的担心安全性,那么在使用shell脚本之前应该三思而后行。 编写适当的Shell脚本一点也不简单,而且充满了陷阱。

您可以使用类似Python的机制。 定义变量和/或函数,并将可执行命令放入条件块中:

#!/bin/bash

# Variables and functions comes here
a=1
b=2

function foo() {
    echo "bar"
}

# Put executable commands here
if [ "$0" = "$BASH_SOURCE" ] ; then
    foo
fi

如果您使用chmod +x文件并运行它,或者通过bash file.sh运行它, bash file.sh执行条件语句中的可执行命令。 如果您提供文件源,则只会导入变量和函数。

一些基本的方法可能会起作用:

name="$(sed -n 1p < source_file | grep -o 'name="[^"]*' | grep -o '[^"]*$')"

lastname="$(sed -n 2p < source_file | grep -o 'lastname="[^"]*' | grep -o '[^"]*$')"

age="$(sed -n 3p < source_file | grep -o 'age="[^"]*' | grep -o '[^"]*$')"

接下来,检查参数是否符合某些标准,例如,是否与数据库名称( $LIST_NAMES )相匹配,或者您是否具有一定数量的字符串,等等。

if ! grep -Fox "$name" <<<"$LIST_NAMES"; then exit 1; fi

if [ $(wc -c <<<"$age") -gt 3 ]; then exit 1; fi

然后只采取有用的行,以防止其余部分。

head -n3 < source_file > source_file.tmp

source 'source_file.tmp'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM