2011-03-20 8 views
1

우리는 PHP 편집기에서 PHP 내부에서 사용할 수 있지만, file_get_contents, file() 및 global과 같은 일부 명령에 액세스를 제한해야합니다.제한이있는 PHP 코드 실행

누군가 부울 응답 정규식으로 나를 도울 수 있습니까? 템플리트의 텍스트는 문자열에 저장됩니다.

이에 대한 아마 이상적인 방법 내가 아는

하지만, 내가 지금 가지고 올 수 : 당신은 이것에 대한 preg_match을 사용할 수 있습니다

+4

분명히 문제가 있습니다. '$ a = 'file'은 어떨까요? $ a();'? – knittl

+0

관련 : http://stackoverflow.com/questions/3115559/exploitable-php-functions/ – Unicron

답변

5

원하는 작업은 거의 불가능합니다. 사람들이 컴퓨터에서 코드를 실행할 수 있도록 허용하면 공격으로부터 자신을 보호하기가 정말 어렵습니다.

여기에 제가 시도한 내용이 있습니다 : Sandbox. Source code.

기본적으로 파일 시스템 액세스, 쉘 액세스, aso에 대한 블랙리스트에있는 기능 목록을 많이 유지합니다. show_source과 같은 파일 시스템을 읽을 수있는 일부 기능은 허용되지 않아야합니다.)

또한 $func = 'unlink'; $func(__FILE__);과 같은 더 많은 숨겨진 공격을 $func = 'unlink'; ${'___xyz'.!$___xyz=Sandbox::checkVarFunction($func)}(__FILE__)으로 설정하여 보호하려고 시도합니다.

추신 : 아직도 사람들이 PHP 코드를 사이트에서 실행할 수 있도록 허용하고 싶지는 않을 것입니다. 위험은 너무 큽니다. 대신 나는 사람들이 편집기 내부에서 템플릿 언어를 사용할 수있게 할 것이다. 좋은 후보는 Twig이 될 것입니다. 왜냐하면 그것은 특정 태그, 기능, 사용법을 제한 할 수있는 샌드 박스를 내장하고 있기 때문입니다 ...

+0

저는 소스 코드를 물어볼 때가 있습니다. :) 감사합니다! – Joe

+0

@Joe'hightlight_file ('./ src/Sandbox.php');';)을 실행하여 소스를 얻을 수 있습니다. – alexn

-2

전부입니다. 용도 :

if(preg_match("#(file_get_contents|file)\(#i",$text)) 
+0

'$ evil = "fi". "le"은 어떨까요? "_ get_contents"; $ 악마 ($ URL);'? – Unicron

+0

사실, 멀리까지 생각조차하지 못했습니다. 공개적으로 PHP 코드를 허용하는 이상한 비트. – Jens

2

자신을 완벽하게 보호하는 것은 매우 어려울 것입니다.

내가 그것을보고, 당신은 몇 가지 옵션이 있습니다 (file_get_contents 같은) 콘텐츠에서 허용되지 않습니다 미리 정의 된 문자열에 대한

  1. 검색하고 사용자가 때문에 저장할 수 없다는 오류 메시지가 표시 이. 그러나 "해킹"으로 이어져 어떤 경우에는 유효 할 수있는 ()과 같은 가능한 모든 문자를 검색하게됩니다.

  2. token_get_all을 사용하고 내용을 PHP로 분석하십시오. 그런 다음 전체 소스 코드, 토큰별로 토큰을 반복 할 수 있으며 허용하지 않는 토큰을 찾았는지 확인하십시오.

  3. 이 경우 자신의 언어 또는 DSL을 작성하십시오. 이 언어는 원하는 것을 정확하게 할 수 있어야합니다. 요구 사항에 따라 이것이 가장 쉽고 유지 보수가 용이 한 방법입니다.