[PHP]System program execution

Seo Joonsoo·2022년 6월 25일
1

php

목록 보기
21/23

escapeshellarg(string $arg): string

문자열 주위에 작은 따옴표를 추가하고 기존의 작은 따옴표를 인용/이스케이프하여 문자열을 쉘 함수에 직접 전달하고 단일 안전한 인수로 처리할 수 있도록 합니다. 이 함수는 사용자 입력에서 오는 쉘 함수에 대한 개별 인수를 이스케이프하는 데 사용해야 합니다.

Windows에서 escapeshellarg() 는 대신 백분율 기호, 느낌표(지연 변수 대체) 및 큰따옴표를 공백으로 바꾸고 문자열 주위에 큰따옴표를 추가합니다. 또한 연속된 백슬래시( )의 각 줄은 하나의 추가 백슬래시로 이스케이프됩니다.

system('ls '.escapeshellarg($dir));

escapeshellcmd(string $command): string

임의의 명령을 실행하도록 쉘 명령을 속이는 데 사용할 수 있는 문자열의 모든 문자를 이스케이프합니다. 이 함수는 이 데이터가 exec() 또는 system() 함수 또는 백틱 연산자로 전달되기 전에 사용자 입력에서 오는 모든 데이터가 이스케이프되었는지 확인하는 데 사용해야 합니다.

escapeshellcmd() 는 전체 명령 문자열에 사용해야 하며 여전히 공격자가 임의의 수의 인수를 전달할 수 있습니다. 단일 인수를 이스케이프하려면 escapeshellarg() 를 대신 사용해야 합니다.

예제 #1. escapeshellcmd() 예제

$command = './configure '.$_POST['configure_options'];
$escaped_command = escapeshellcmd($command);
system($escaped_command);

프로세스 핸들링에는 단방향과 양방향으로 나뉘게 됩니다.
popen()은 단방향 핸들링이 가능하고 proc_open()은 양방향 핸들링에 사용됩니다.



popen(string $command, string $mode): resource|false

command에서 제공한 명령을 분기하여 실행되는 프로세스에 대한 파이프를 엽니다.


pclose(resource $handle): int

popen() 에 의해 열린 파이프에 대한 파일 포인터를 닫습니다 .

$handle = popen('/bin/ls', 'r');
pclose($handle);

proc_open()

proc_open(
    array|string $command,
    array $descriptor_spec,
    array &$pipes,
    ?string $cwd = null,
    ?array $env_vars = null,
    ?array $options = null
): resource|false

proc_open() 은 popen() 과 유사 하지만 프로그램 실행에 대해 훨씬 더 높은 수준의 제어를 제공합니다.

예 #1

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin은 자식이 읽을 파이프입니다.
   1 => array("pipe", "w"),  // stdout은 자식이 쓸 파이프입니다.
   2 => array("file", "/tmp/error-output.txt", "a") // stderr은 쓸 파일입니다.
);

$cwd = '/tmp';
$env = array('some_option' => 'aeiou');

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);

if (is_resource($process)) {
    // $pipes는 다음과 같이 보입니다:
    // 0 => 자식 stdin에 연결된 쓰기 가능한 핸들
    // 1 => 자식 stdout에 연결된 읽기 가능한 핸들
    // 모든 오류 출력은 /tmp/error-output.txt에 추가됩니다.

    fwrite($pipes[0], '<?php print_r($_ENV); ?>');
    fclose($pipes[0]);

    echo stream_get_contents($pipes[1]);
    fclose($pipes[1]);

	// 호출하기 전에 파이프를 닫는 것이 중요합니다.
    // 교착 상태를 피하기 위해 proc_close
    $return_value = proc_close($process);

    echo "command returned $return_value\n";
}

/* 실행결과
Array
(
    [some_option] => aeiou
    [PWD] => /tmp
    [SHLVL] => 1
    [_] => /usr/local/bin/php
)
command returned 0
*/

proc_close(resource $process): int

proc_open() 에 의해 열린 프로세스에서만 작동한다는 점을 제외하면 pclose() 와 유사합니다. proc_close() 는 프로세스가 종료될 때까지 기다렸다가 종료 코드를 반환합니다. 교착 상태를 피하기 위해 이 함수가 호출될 때 해당 프로세스에 대한 열린 파이프가 닫힙니다. 파이프가 열려 있는 동안 자식 프로세스가 종료되지 않을 수 있습니다.






System program execution

미리 정의된 상수

프로그램 실행 기능

  • escapeshellarg — 셸 인수로 사용할 문자열을 이스케이프 처리합니다.
  • escapeshellcmd — 이스케이프 셸 메타 문자
  • proc_get_status — proc_open에 의해 열린 프로세스에 대한 정보 가져오기
  • proc_nice — 현재 프로세스의 우선 순위 변경
  • proc_open — 명령을 실행하고 입출력을 위한 파일 포인터 열기
  • proc_close — proc_open에 의해 열린 프로세스를 닫고 해당 프로세스의 종료 코드를 반환합니다.
  • proc_terminate — proc_open에 의해 열린 프로세스를 종료합니다.
  • exec — 외부 프로그램 실행
  • shell_exec — 셸을 통해 명령을 실행하고 전체 출력을 문자열로 반환
  • system — 외부 프로그램을 실행하고 출력을 표시합니다.
  • passthru — 외부 프로그램을 실행하고 원시 출력을 표시합니다.
profile
여러분들 삶에 한 획을 더하고 싶습니다.

0개의 댓글