' '
으로 실행 코드를 래핑하지 않는 것이 문제인 것처럼 보입니다. 코드, 특수 문자, 이스케이프 시퀀스 등에서 '
을주의해야합니다.
실제로 exec()
을 사용하고 싶다면 이스케이프 걱정을 완전히 피하려면 등) 등 : 대신 위의 게시하는지의
$command = base64_encode($command);
exec("php -r 'eval(base64_decode(\"$command\"));'", $output);
당신 수 사용 eval()
.
는
주요 문제가 여기 (모두 eval()
하고 exec()
코드)는 사용자 입력 에서 PHP 코드를 복용하는 것은 단순히 안전되지 않는 것입니다 :
평가 후면() 언어 구조는 매우 위험합니다입니다. 임의의 PHP 코드를 실행할 수 있기 때문입니다.그 사용은 권장하지 않습니다. 주의 깊게이 구조를 사용하는 것보다 다른 옵션이 있다는 것을 확인하는 경우은 제대로 사전 검증없이 사용자가 제공 한 데이터 그것에을 통과하지 특별한주의를 을 지불합니다.
제안
당신이 PHP 코드의 결과를 반환 할 때문에, 당신은 잠재적으로 당신이 (스크립트에 기본 인코딩 (64) PHP 코드를 통과 AJAX, 멋진 일을 할 수있는, 아마도) 파라미터로서 :
$code = base64_decode($_GET['code']);
// clean the user input here
eval($code);
AJAX 예 jQuery를 사용 :
// assuming `code` contains the PHP code
var encoded = base64_enc(code);
$.get('execute.php?code=' + encoded, function(data) {
var result = new String(data);
// do something with the result here, such as displaying it
}, dataType='text');
01,235, JavaScript의 기본 64 인코딩 인 경우 see this.
'exec ("php -r \"$ command \ "", $ output)'시도해보십시오. 어쨌든 너무 위험한 make 사용자는 컴퓨터에서 명령어를 실행할 수있다. – safarov
'eval' http://php.net/manual/en/function.eval.php를 살펴 보라. 거기에있는 사용자. 미리 크게 필터링해야합니다. – Nick
더 나은 점은 ['Runkit_Sandbox'] (http://de2.php.net/manual/en/runkit.sandbox.php)를보십시오. – vstm