"eval echo"를 사용하는 것이 항상 안전합니까?

"eval echo"를 사용하는 것이 항상 안전합니까?

eval임의의 코드 실행을 허용하므로 일반적으로 사용하지 않는 것이 좋습니다 . 하지만 를 사용하면 eval echo문자열의 나머지 부분이 매개변수가 될 것처럼 보이 echo므로 안전할 것입니다. 나 맞아?

답변1

반례:

DANGEROUS=">foo"
eval echo $DANGEROUS

임의의 인수는 echo"foo"라는 파일을 생성하는 것보다 더 사악한 작업을 수행할 수 있습니다.

답변2

@Celada가 훌륭한 답변을 제공했습니다. 시위는 eval정말 사악하고 여기는"foo"라는 파일을 만드는 것보다 더 사악한 것:

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

물론 그럴 수도 있다."foo"라는 파일을 만드는 것보다 더 사악한 것.

답변3

아니요아니요항상 안전합니다. eval은 모든 명령을 실행할 수 있습니다.

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

$ 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!

답변4

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명령줄을 구문 분석하는 동안 첫 번째 중괄호 세트가 확장되는 것을 방지하여 호출하는 subshell에 의해 확장될 수 있도록 하기 때문에 작동합니다 eval.

중첩된 중괄호 확장과 관련된 교묘한 계획이 있을 수 있으므로 이를 한 단계로 수행할 수 있지만, 만약 그렇다면 나는 너무 늙고 어리석어서 그것을 볼 수 없습니다. 그 외에도 bash이런 종류의 작업을 더 깔끔하게 수행할 수 있는 다른 쉘이 있습니다 . 그러나 어떤 경우에도 이 사용은 eval해당 매개변수가 매개변수 확장을 포함하지 않는 고정 문자열이기 때문에 안전합니다.

관련 정보