`eval echo`를 사용하는 것이 항상 안전한가요? 사용을 권장하지 않습니다. 그러나을 사용 eval echo하면

eval임의 코드를 실행할 수 있으므로 사용을 권장하지 않습니다. 그러나을 사용 eval echo하면 나머지 문자열이 인수가되는 것처럼 보이 echo므로 안전해야합니다. 내가 맞습니까?



답변

반례 :

DANGEROUS=">foo"
eval echo $DANGEROUS

임의의 인수 echo는 “foo”라는 파일을 만드는 것보다 더 사악한 일 을 할 수있었습니다.


답변

@Celada는 훌륭한 답변을 제공했습니다. eval실제로는 악의 를 나타 내기 위해 “foo”라는 파일을 만드는 것보다 더 사악한 것이 있습니다 .

DANGEROUS='$(rm foo)'
eval echo "$DANGEROUS"

물론 “foo”라는 파일을 만드는 것보다 더 사악한 것보다 더 사악한 것이 있을 수 있습니다 .


답변

아니요, 항상 안전 하지는 않습니다 . 평가자는 모든 명령을 실행할 수 있습니다.

다음과 같은 안전한 명령 (날짜는 작은 따옴표 안에 있으므로 실행되지 않습니다) :

$ echo '$(date)'
$(date)

eval과 함께 사용하면 위험 해집니다.

$ eval echo '$(date)'
Sat Dec 24 22:55:55 UTC 2016

물론 날짜는 모든 명령 이 될 수 있습니다 .

이를 개선하는 한 가지 방법은 평가를 eval에 추가 인용하는 것입니다.

$ eval echo '\$(date)'
$(date)

그러나 일반적으로 표현식을 두 번 올바르게 인용하는 것은 어렵습니다.

다음과 같이 외부 공격자가 식을 설정할 수 있으면 올바른 인용을 제어 할 수 없습니다.

$ var='$(date);echo Hello!'
$ eval echo "$var"
Sat Dec 24 23:01:48 UTC 2016
Hello!

답변

이 것은 사실이지만 eval항상 신중하게 접근 할 필요는 eval echo건설 항상 무의미하지 않고 할 수 안전하게 사용할 수. 최근에 여러 괄호 확장을 필요한 순서대로 평가하기 위해 필요했습니다.

bash 왼쪽에서 오른쪽으로 여러 개의 괄호 확장을 수행하므로

xargs -I_ cat _/{11..15}/{8..5}.jpg

~로 확장

xargs -I_ cat _/11/8.jpg _/11/7.jpg _/11/6.jpg _/11/5.jpg _/12/8.jpg _/12/7.jpg _/12/6.jpg _/12/5.jpg _/13/8.jpg _/13/7.jpg _/13/6.jpg _/13/5.jpg _/14/8.jpg _/14/7.jpg _/14/6.jpg _/14/5.jpg _/15/8.jpg _/15/7.jpg _/15/6.jpg _/15/5.jpg

하지만 먼저 두 번째 괄호 확장이 필요했습니다.

xargs -I_ cat _/11/8.jpg _/12/8.jpg _/13/8.jpg _/14/8.jpg _/15/8.jpg _/11/7.jpg _/12/7.jpg _/13/7.jpg _/14/7.jpg _/15/7.jpg _/11/6.jpg _/12/6.jpg _/13/6.jpg _/14/6.jpg _/15/6.jpg _/11/5.jpg _/12/5.jpg _/13/5.jpg _/14/5.jpg _/15/5.jpg

내가 할 수있는 최선은

xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)

작은 따옴표는 eval명령 행을 구문 분석하는 동안 첫 번째 중괄호 세트가 확장되지 않도록 보호하여에 의해 호출 된 서브 쉘에 의해 확장되도록합니다 eval.

중첩 괄호 확장과 관련된 교활한 계획이있을 수 있습니다. 단순히이 작업을 수행 할 수는 있지만 너무 오래되어 어리석은 경우입니다. bash이런 종류의 것을 달성하는 더 깔끔한 방법을 허용하는 것 이외의 껍질도 있습니다 . 그러나 어쨌든 eval인수는 모두 매개 변수 확장이 포함되지 않은 고정 문자열이기 때문에 이러한 사용 은 안전합니다.