스크립트는 외부 입력을 평가하는데 이는 매우 안전하지 않은 방식입니다.
eval
평가 스크립트에서 외부 입력을 처리하거나 대체할 수 있는 방법이 있습니까 ?
감사해요.
답변1
에 전달된 인수가 외부 입력에서 나온 것이 아닌지 확인하세요 eval
. 그렇지 않으면 사전에 삭제했습니다.
다음과 같이 하지 마세요.
n=0
....
n=$((n + 1))
eval "var$n=$1"
$n
아래에당신의통제, 내용은 $1
그렇지 않습니다. 예를 들어, 그렇다면 $1
eval은 해석할 코드를 수신한 다음 다시 시작합니다.foo;reboot
var3=foo;reboot
사용:
eval "var$n=\$1"
그러면 반대로 eval
받게 될 것입니다 var3=$1
. 좋은 일입니다.
eval "$1=\$2"
또한 틀릴 수도 있습니다. 보장해야 할 것은 콘텐츠가 $1
허용 가능한 값 집합(위생 처리됨)에서만 나오는 것입니다.
unset -v var1 foo bar
case $1 in
(var1 | foo | bar) eval "$1=\$2";;
(*) echo >&2 unexpected variable name; exit 1;;
esac
이것은 임의의 코드를 평가하는 유일한 명령 이 아니며 , ,,,,,,,,,,,, 등 다른 것들이 똑같이 조심 해야하는 일부 쉘에도 많은 다른 코드 가 eval
있습니다 .sh
perl
awk
sed
read
export
typeset
printf
test
[