문자열 주위에 작은 따옴표를 추가하고 기존의 작은 따옴표를 인용/이스케이프하여 문자열을 쉘 함수에 직접 전달하고 단일 안전한 인수로 처리할 수 있도록 합니다. 이 함수는 사용자 입력에서 오는 쉘 함수에 대한 개별 인수를 이스케이프하는 데 사용해야 합니다.
Windows에서 escapeshellarg() 는 대신 백분율 기호, 느낌표(지연 변수 대체) 및 큰따옴표를 공백으로 바꾸고 문자열 주위에 큰따옴표를 추가합니다. 또한 연속된 백슬래시( )의 각 줄은 하나의 추가 백슬래시로 이스케이프됩니다.
system('ls '.escapeshellarg($dir));
임의의 명령을 실행하도록 쉘 명령을 속이는 데 사용할 수 있는 문자열의 모든 문자를 이스케이프합니다. 이 함수는 이 데이터가 exec() 또는 system() 함수 또는 백틱 연산자로 전달되기 전에 사용자 입력에서 오는 모든 데이터가 이스케이프되었는지 확인하는 데 사용해야 합니다.
※ escapeshellcmd() 는 전체 명령 문자열에 사용해야 하며 여전히 공격자가 임의의 수의 인수를 전달할 수 있습니다. 단일 인수를 이스케이프하려면 escapeshellarg() 를 대신 사용해야 합니다.
$command = './configure '.$_POST['configure_options'];
$escaped_command = escapeshellcmd($command);
system($escaped_command);
프로세스 핸들링에는 단방향과 양방향으로 나뉘게 됩니다.
popen()은 단방향 핸들링이 가능하고 proc_open()은 양방향 핸들링에 사용됩니다.
command에서 제공한 명령을 분기하여 실행되는 프로세스에 대한 파이프를 엽니다.
popen() 에 의해 열린 파이프에 대한 파일 포인터를 닫습니다 .
$handle = popen('/bin/ls', 'r');
pclose($handle);
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() 과 유사 하지만 프로그램 실행에 대해 훨씬 더 높은 수준의 제어를 제공합니다.
$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_open() 에 의해 열린 프로세스에서만 작동한다는 점을 제외하면 pclose() 와 유사합니다. proc_close() 는 프로세스가 종료될 때까지 기다렸다가 종료 코드를 반환합니다. 교착 상태를 피하기 위해 이 함수가 호출될 때 해당 프로세스에 대한 열린 파이프가 닫힙니다. 파이프가 열려 있는 동안 자식 프로세스가 종료되지 않을 수 있습니다.