2012-05-03 2 views
0

나는 포크()/간부() 사용자가 같은 것을 넣지 수 있도록 명령 인수의 일부로서 사용자 입력이있는 경우/...) (오히려 시스템보다) (대기를 사용안전한 버전의 popen()?

&rm -rf /home/* && echo HAHA 

... 논쟁으로.

나는 popen이 하나의 문자열을 취하고 exec 가족과 같은 문자열 목록을 가지지 않기 때문에 popen이 system()만큼 위험하다고 가정하고 있습니다.

나는 단지 exec 함수에서 반환 값을 얻을 수 있습니다. 부모 프로세스에서 stdout/stderr을 다시 사용자 입력으로 처리 할 수있는 "안전한"popen 버전이 있습니까?

답변

3

안전한 방법은 직접 전화 pipe()을 사용하여 필요한 파이프를 직접 설치하는 것입니다.

그게 뭔지는 popen()이지만 하위 프로세스를 실행하기 위해 쉘을 호출합니다. 그 단계를 건너 뛰면 더 안전하게 만들어야합니다.

+0

+1 예, popen 소스 코드를 살펴보십시오 (예 : http://www.cse.lehigh.edu/~brian/course/2011/cunix/notes/ch11/popen.c). –

+0

@Adriano, 좋은 ... 고마워. 너 너무 긴장 해. popen이 이미 execl을 사용하고있는 것처럼 보입니다. 아마도 복사 할 것이지만 null로 종료 된 va_list 또는 char * []로 인수를 전달하고 execl 대신 execv를 호출합니다. –