2013-03-01 2 views
0

child_process.execFile 명령을 사용하여 명령 줄 유틸리티를 실행하는 node.js 앱이 있습니다.Bash 스크립트에서 execFile을 사용하는 것이 얼마나 안전합니까?

사용자가 로컬로 명령을 실행할 수 있다고 걱정됩니다 (rm/-rf 공포의 시나리오가 떠오름).

Bash 스크립트에 execFile을 얼마나 안전하게 사용합니까? execFile에 전달하는 플래그가 서버를 호스팅하는 유닉스 박스에 의해 이스케이프되도록하는 팁은 무엇입니까? 인수는 명령으로 해석하고 실행할 수있는 파일로 전송되는 경우

편집

더 정확히 말하면, 내가 더 궁금하네요.

다른 문제는 기술적으로이 질문의 범위를 벗어나는 bash 스크립트 자체 내부입니다.

+0

물론 가능합니다. 권한으로 보안을 제어하십시오. 그것은 당신이하는 것만 큼 안전합니다. – Chad

+0

나는 이것을 주석으로 던질 것이다. 그러나 이런 식으로 사용자 입력을 사용하지 말 것을 제안한다. 제한된 수의 옵션이있는 경우 입력을 가져 와서 명령에 삽입 할 플래그를 선택하지만 사용자 데이터를 명령에 직접 넣지는 마십시오. – travis

+0

"execFile에 전달하는 플래그는 서버를 호스팅하는 유닉스 박스에 의해 이스케이프됩니다"라는 것은 무엇을 의미합니까? –

답변

1

child_process.execFile을 단독으로 사용하는 것은 사용자가 명령 이름을 지정하지 않는 한 완벽하게 안전합니다.

쉘에서 명령을 실행하지 않으므로 (child_process.exec처럼) 아무 것도 이스케이프 할 필요가 없습니다.

+0

아, 명령을 실행하면 노드 서버 코드에서 전송 된 인수가 실제 인수로 해석됩니다. 그런 다음 실제로 보안은 스크립트 자체와 스크립트가 실행하는 명령의 손에 달려 있습니다. –

+1

오른쪽. 스크립트 자체에서주의해야 할 주요 사항은 sed, awk 또는 find의 코드 삽입과 공백과 줄 바꿈으로 인수를 처리 (또는 무시)하는 것입니다. –

+0

완벽 하군, 그게 바로 내가 걱정하고 있었던거야.이 일을 처리하는 가장 좋은 방법은 Bash 스크립트에 전달되는 인수에서 모든 공백과 새 행을 제거하는 것입니다. 문자열에 __dirname을 추가하기 바로 전에이 작업을 수행 할 수 있습니다. 절대 경로에 공백이 있으면 문제가 발생하지 않습니다. 다시 한 번 고맙습니다. –

1

child_process.execFile은 노드 프로세스의 사용자 ID로 명령을 실행하므로 사용자가 수행 할 수있는 모든 작업 (모든 서버 파일 제거 포함)을 수행 할 수 있습니다.

사용자가 질문에 암시하는 것처럼 보이도록 명령을 전달하는 것은 좋지 않습니다.

chroot을 사용하여 샌드 박스에서 스크립트를 실행하고 명령과 사용할 수있는 파일 시스템에있는 것을 제한 할 수는 있지만 서둘러 완료 될 수 있습니다.

전달할 명령은 exec의 향미료를 통해 직접 실행되기 때문에 실행하려고 시도하는 것이 스크립트 인 경우가 아니면 어떤 식 으로든 이스케이프 할 필요가 없습니다.

+0

사용자가 어떤 파일이 실행되고 있는지 설정할 수 없습니다. 나는 명령에 전달되는 인수가 명령으로 해석 될 수 있다는 것에 대해 더 걱정하고있다. –

+0

그때 나는 그렇게 걱정하지 않을 것입니다. 명령에 대한 절대 경로 이름을 사용하면 실행 대상을 확실히 알 수 있습니다. –

+0

스크립트를 실행중인 경우 아무 것도 이스케이프하지 않아도됩니다. –

관련 문제