>  기사  >  백엔드 개발  >  PHP가 외부 명령을 호출할 수 없는 경우 처리 방법

PHP가 외부 명령을 호출할 수 없는 경우 처리 방법

WBOY
WBOY원래의
2016-07-25 08:58:471286검색
  1. exec(""/bin/ls -l"");
  2. exec(""/bin/ls -l" ", $res);
  3. #$res는 데이터이며, 각 요소는 결과의 행을 나타냅니다.
  4. exec(""/bin/ls -l"", $res, $rc);
  5. # $rc의 값은 /bin/ls -l 명령의 상태 코드입니다. 성공할 경우 보통 0
  6. ?>
코드 복사

passthru() 프로토타입: void passthru (string command [, int return_var]) passthru()는 명령을 호출하기만 하고 결과를 반환하지 않고 명령의 실행 결과를 그대로 표준 출력 장치에 출력합니다. 따라서 passthru() 함수는 pbmplus(원본 이미지의 바이너리 스트림을 출력하는 Unix에서 이미지 처리 도구)와 같은 프로그램을 호출하는 데 자주 사용됩니다. 또한 명령 실행의 상태 코드를 가져올 수도 있습니다.

예:

  1. header(""콘텐츠 유형: image/gif"");
  2. passthru(""./ppmtogif hunte.ppm"");
  3. ?>
코드 복사

2, popen() 함수를 사용하여 프로세스를 엽니다. 위의 방법은 단순히 명령을 실행할 수만 있고 명령과 상호 작용할 수는 없습니다. 그러나 명령에 무언가를 입력해야 하는 경우도 있습니다. 예를 들어 Linux 시스템 사용자를 추가할 때 su를 호출하여 현재 사용자를 루트로 변경해야 하며, su 명령은 명령줄에 루트 암호를 입력해야 합니다. 이 경우 위에서 언급한 방법을 사용하는 것은 당연히 불가능합니다.

popen() 함수는 주어진 명령을 실행하기 위해 프로세스 파이프를 열고 파일 핸들을 반환합니다. 파일 핸들이 반환되므로 읽고 쓸 수 있습니다. PHP3에서 이러한 종류의 핸들은 쓰기 또는 읽기의 단일 작업 모드에서만 사용할 수 있으며, PHP4부터는 동시에 읽고 쓸 수 있습니다. 핸들이 한 가지 모드(읽기 또는 쓰기)로 열리지 않는 한, 핸들을 닫으려면 pclose() 함수를 호출해야 합니다.

예 1:

  1. $fp=popen(""/bin/ls -l"", ""r"");
  2. ?>
코드 복사

예 2:

  1. /* PHP에서 시스템 사용자를 추가하는 방법
  2. james라는 사용자를 추가하고,
  3. 루트 비밀번호입니다. 매우 좋은. 참고용
  4. */
  5. $sucommand = ""su --login root --command"";
  6. $useradd = ""useradd "";
  7. $rootpasswd = ""verygood"" ;
  8. $user = ""james"";
  9. $user_add = sprintf(""%s ""%s %s"""",$sucommand,$useradd,$user);
  10. $ fp = @popen($user_add,""w"");
  11. @fputs($fp,$rootpasswd);
  12. @pclose($fp);
  13. ?>
코드 복사

3, 백틱 사용(`, 즉 키보드 ESC 키 아래에 있는 것, ~와 동일) 방법은 매우 간단합니다. 두 개의 백틱을 사용하여 실행할 명령을 표현식으로 묶습니다. 이 표현식의 값은 명령 실행의 결과입니다. 좋다:

  1. $res=`/bin/ls -l`;
  2. echo '
     '.$res.'
    ';
  3. ?>
코드 복사

출력은 다음과 유사합니다. 이것: 헌트.gif 헌테.ppm jpg.htm jpg.jpg passthru.php 고려해야 할 두 가지 문제는 보안과 시간 초과입니다. 먼저 안전을 살펴보겠습니다. 예를 들어 소규모 온라인 상점이 있으므로 판매할 수 있는 제품 목록이 파일에 저장되어 있습니다. 사용자가 이메일 주소를 입력한 다음 제품 목록을 보낼 수 있는 양식을 사용하여 HTML 파일을 작성합니다. PHP의 mail() 함수를 사용해 본 적이 없거나 들어본 적이 없다고 가정하면 Linux/Unix 시스템의 메일 프로그램을 호출하여 이 파일을 보냅니다. 프로그램은 다음과 같습니다:

  1. system(""mail $to < products.txt"");
  2. echo ""제품 카탈로그가 받은 편지함으로 전송됨: $to"";
  3. ?>
코드 복사

이 코드를 사용해도 일반 사용자에게는 아무런 위험이 발생하지 않지만 실제로는 매우 큰 보안 취약점이 있습니다. 악의적인 사용자가 이러한 이메일 주소를 입력하는 경우: '--bla someone@domain.com으로 메일 보내기 ) 및 파일에서 읽기(

시간 초과 문제 실행하려는 명령이 오랜 시간이 걸릴 경우 시스템 백그라운드에서 명령을 실행해야 합니다. 그러나 기본적으로 system()과 같은 함수는 반환하기 전에 명령 실행이 완료될 때까지 기다립니다(실제로 명령의 출력을 기다려야 합니다). 이로 인해 확실히 PHP 스크립트가 시간 초과됩니다.

해결책: 명령의 출력을 다른 파일이나 스트림으로 리디렉션합니다. 예:

  1. system(""/usr/local/bin/order_proc > /tmp/null &"");
  2. ?>
코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.