2010-08-12 4 views
1

은 내가 CMS MVC의 스타일을 작성 봤는데, 어떻게 평가 악한 알고 말 내가 할어떻게이 동적 데이터를 eval없이 출력 할 수 있습니까?

eval('?>'.($template).'<?'); 

에서 file_get_contents

를 통해 필요한 다양한 파일에 끌어 템플릿 클래스를 사용했다 PHP가 실제로 코드를 렌더링 할 수 있도록이 데이터를 플러시 할 수 있습니까?

지금까지 템플릿 클래스는 모든 것이로드 된 후에이 작업을 수행합니다. Template 클래스가이 코드를 내 index.php에 변수로 반환 한 다음 실행하기 위해 무언가를 실행 할 수 있습니까?

내가 만난 MVC 스타일 사이트를 코딩하는 모든 예는이 문제를 해결하기 위해 eval을 사용합니다.

관련 추가 질문 - 평가판이 악의적 인 사용자 입력 코드를 실행하는 데 사용될 수 있다는 것을 알고 있지만 다른 기능이 동일한 운명을 겪지는 않을 것이라고 생각합니까? html 엔티티로 사용자 컨텐트를 변환하면이 문제가 해결되지 않습니까?


아마도 내 방법은 결함이 있지만 예는 내가 평가 피할 다른 방법을보고 싶어 해요 이유입니다, 읽어 봤는데 다음과 같습니다.

난 그냥 같은 일을 달성이 조각을 찾을 않았다

function interpolate($string){ 
     foreach ($GLOBALS as $name => $value){ 

      $string = str_replace('$'.$name, $value, $string); 
     } 

     $string = preg_replace('/[$]\\w+/', '', $string); 
     return $string; 

    } 

이 효과적으로 올바른 내용으로 변수를 대체하여 모든 코드를 렌더링합니다.

+1

아마도 디자인에 결함이있는 것 같습니다. 당신이 해결하려고하는 것을 간결하게 설명한다면, 아마 eval은 변화를 피할 수 있습니다. –

+0

나는 James에게 동의한다. 당신이하는 일이 불분명 할뿐만 아니라, 왜 그렇게하고 있는지 불분명하다. – timdev

+0

당신은 여기에 대화의 일부에 관심이있을 수 있습니다 - http://stackoverflow.com/questions/3326446/php-templating-with-custom-tags-is-this-a-legit-use-of-eval –

답변

0

내 템플릿에 포함 된 스크립트를 캡처하기 위해 출력 버퍼링을 사용합니다. 포함 된 코드는 다른 포함 된 파일처럼 실행됩니다. 의사 : 버퍼 시작, 파일 포함, 버퍼 캡처, 버퍼 지우기. 그 실행 후에는 내부에 코드를 실행 한 후, $template_output가 포함 된 파일에 의해 아무것도 출력을 할 것이다

//just the name of a template file to include. 
$template = "someFile.tpl"; 
//start output buffering 
ob_start(); 
//include the file. It has full access to all vars and runs 
//code just like any other included script. 
include($template); 
//get anything output by the buffer during the include 
$template_output = ob_get_contents(); 
//clean out the buffer because we already got the contents. 
ob_end_clean(); 

: 여기에 간단한 예입니다. 이렇게하면 '뷰'를 처리 할 때 루프와 변수 등을 사용할 수 있습니다.

템플릿 파일을 변경하는 사람은 내 개인 사이트에서만 사용됩니다. 다른 사람이 템플릿 파일을 편집하는 것을 허용하지 않습니다. 그렇게 말도 안되게 바보가됩니다.

+0

나는 ' d는 그 라인을 따라 몇 가지 시도를했지만 작동하지 않는 것 같습니다 - 주로 컨트롤러가 템플릿 구성 요소의 변수에 결과를 할당하기 때문에 런타임에 문제를 일으킨 결과를 실제로 평가하는 것이 었습니다 . 편집에서 추가 한 코드는 효과적으로 동적 변수를 렌더링합니다. 나는 여전히 데이터베이스에 저장된 사용자 입력에서 오는 아무 것도 올바르게 위조하지 않고도 이것이 eval보다 더 안전하다고 확신하지는 못합니다. – niggles

관련 문제