2009-12-05 4 views
3

전에 프로그래밍 한 적이 없지만 작업을 위해 매우 간단한 웹 응용 프로그램을 작성해야했습니다.왜 내 Perl 백틱이 "sh : line 1 : any : command not found"라고 불평합니까?

나는 일이 발굴 쿼리를 얻기 위해 노력하고있어이를 제외

$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`; 

는 "어떤"말에 인식하지 않는 것 : 펄의이 비트와

dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any 

발굴 및 제공 :

sh: line 1: any: command not found 

어리석은 간단한 일을 내가 잘못하고 있습니까?

+6

어리석은 간단한 일은 아마도 $ query의 내용을 신뢰하는 것과 관련이 있습니다. 공격을 기다리는 해킹. – Don

+0

질문과 관련이 없지만 역 인용 부호 대신 qx를 사용하는 것이 좋습니다 –

답변

11

나는 $query에 새 줄이있어서 셸이 any을 새로운 명령으로 보게됩니다.

시스템 호출 전에 chomp $query;을 시도하여 개행을 제거하십시오. chomp에 대한 자세한 정보

+0

네, 고맙습니다. – scraft3613

+2

Net :: DNS :: Resolver가이 쿼리를 수행하는 데 훨씬 안전한 방법을 제공합니다. –

1

아마도 가장 큰 변수는 명령 문자열을 위반하는 $ query 변수에있는 것입니다. 우리가 실패하고 오류를주는 예를 우리에게 줄 수 있습니까? 또는 스크립트를 좀 더 보여 주시겠습니까?

2

아마도 dig ... '$query'을 사용해야합니다. 그러면 쉘이 볼 때 작은 따옴표가 붙습니다. 그렇게하지 않으면 쉘은 모든 메타 문자를 해석합니다. 누군가가 "; echo my_key > ~/.ssh/authorized_keys"을 웹 양식에 넣으면 망가집니다. 내부 용도로만 사용하는 경우라도 누군가가 검색어에 공백이있는 문자를 넣으면 (단어가 분리되어 두 개의 인수로 파기됩니다)

사용할 수 있습니다. 펄의

\Q$query\E
은 잠재적 인 메타 문자가 이스케이프 된 $ 쿼리를 확장합니다. 실제로 작은 따옴표를 추가하는 것보다 훨씬 낫습니다. 쿼리에 작은 따옴표가 포함되어 있으면 따옴표에서 빠져 나올 것입니다. 여전히 공격하기 쉽습니다. 이 should fix that in into your memory.

Perl은 system() 함수를 사용하여 쉘 명령으로 평가할 문자열이 아닌/bin/sh를 피하면서 args를 문자열 목록으로 지정하는 안전한 방법을 제공합니다. 이것은 가장 안전한 방법이지만, 파이프를하지 않고 백틱 버전이 없습니다. & & 포크 & & exec.

+0

작은 따옴표로는 보안되지 않습니다. 그리고 http://xkcd.com/327/에 링크하려면 –

관련 문제