bash에서 문자열을 실행하기 위해 eval을 사용할 때의 보안 위험

bash에서 문자열을 실행하기 위해 eval을 사용할 때의 보안 위험

다음을 고려하세요:

$ a='friend'
$ b='printf "%s\n" "$a"'
$ eval "$b"
friend

이는 완전히 안전해야 합니다. 그러나 $b동일하지만 알려지지 않았다고 말할 수 있습니다 $a. 그럼 안전상의 문제는 없나요? eval "$b"그렇다면 이러한 위험을 완화하기 위해 어떤 조치를 취할 수 있습니까?

답변1

b리터럴 문자열이 포함된 경우 , 즉 printf "%s\n" "$a"사전에 확장하지 않은 경우에는 괜찮습니다. 정적 명령만 있으므로 왜 거기가 필요한지 잘 모르겠습니다. 직접 실행해 보세요.$aeval "$b"evalprintf "%s\n" "$a"

귀하는 귀하의 의견에서 나중에 사용할 수 있도록 일부 명령을 저장하고 싶다고 말했습니다. 이것이 바로 함수가 하는 일입니다. 예를 들어, printf명령은 다음과 같은 함수가 될 수 있습니다.

println() {
    printf "%s\n" "$1"
}

어떤 방식으로 실행 합니까 println "hello there"? 은 함수의 첫 번째 매개변수이지만, 물론 대신 stdin을 읽거나 여러 매개변수를 사용할 수 있습니다( , , ...; 또는 모두 목록으로 포함 (유사 )).println "$a""$1""$2""$3""$@""${array[@]}"

마찬가지로, 더 긴 작업 세트의 경우:

#!/bin/bash
say_hi() {
    echo "hello, $1"
}
louder() {
    echo "$1!"
}
funcs=(say_hi louder)
names=(Huey Dewey Louie)
for name in "${names[@]}"; do
    tmp=$name
    for func in "${funcs[@]}"; do
        tmp=$($func "$tmp")
    done
    echo "result: $tmp"
done

관련 정보