bash算术扩展似乎容易受到注入攻击

bash算术扩展似乎容易受到注入攻击

假设您希望脚本从环境中获取变量:

#!/usr/bin/env bash
set -eu

if (( ${A-} )); then
    echo true
else
    echo false
fi

算术扩展在这里似乎更合理地处理(empty)01情况或 else:

if [ "${A-}" ] && [ "${A-}" != 0 ]; then

但是之后,

$ A='1 - 1' ./1.sh
false
$ A='B = 1' ./1.sh
true

所以现在您基本上可以更改变量,而您通常不想允许这样做。你有什么建议?如何处理从环境变量中获取的布尔标志?

答案1

如果您不确定变量是否包含 int,您可以验证其值:

#!/usr/bin/env bash
set -eu

vint() {
    local v
    for v; do
        if echo "$v" | egrep '[^0-9]' &> /dev/null; then
            printf '%s: %s: not an int\n' "$0" "$v" >&2
            exit 1
        fi
    done
}

vint "${A-}"
if (( ${A-} )); then
    echo true
else
    echo false
fi

这是我所能接受的。

相关内容