2010-11-30 6 views
9

는 PHP 변수에 저장된 템플릿을 평가, 내가 유식을 사용하여 평가하고 데려 가고 싶다는 php 변수에 출력 (인쇄하거나 다시 데이터베이스에 저장).

감사

편집 : = $ smarty-> 페치 Y (X)의 함유량을 다음 $ A file.tpl에 저장되어있는 경우로서 X의 함유량이, 유식하여 평가하고자

('file.tpl'); ... 파일

+0

내가 유식 사용하여 평가해야 할 X의 내용이, 할 콘텐츠의 경우와 같이 x는 file.tpl에 저장되고 $ y = $ smarty-> fetch ('file.tpl'); ... x의 내용을 파일로 저장할 필요없이이 작업을 수행하려고합니다. –

답변

12

, 당신은 쉽게

$smarty->fetch('string:'.$template_string); 

또는 'eval:'.$template_string에 의해 그것을 할 수 있습니다. manual

2

, 당신은 의미 전체 문자열이 데이터베이스에 있었는데, 즉 {$ link}이 문자열의 일부로 포함되었습니다. 정확히 똑똑한 방법을 잘 모르겠지만, 심지어 그것을 할 수 있다면, 그 문자열은 eval()을 실행해야 할 것입니다. (똑똑한 사람이 내가 잃어버린 펑키 한 일을하지 않는 한, 다시 똑똑한 사람과 일하지 않는다.)

이것은 매우 불안정한 설정이라는 것을 의미합니다. 데이터베이스에 SQL 주입이 발생하면 전체 서버가 손상 될 수 있습니다.

.tpl을 호출 한 코드를 제어 할 수 있고 .tpl 자체를 제어 할 수 있으므로 앱에 하드 코딩 된 파일에서이 코드를 실행하면 큰 문제가되지 않습니다. 이것은 eval을 '안전하게'사용하는 것입니다. 서버를 악용 할 수있는 서버에 대한 심각한 액세스 권한, 즉이를 악용 할 수있는 액세스 종류가 있어야합니다.

하지만 일단 데이터베이스에서 데이터에 액세스하면 새로운 동적 템플릿을 추가 할 수있는 일종의 관리 시스템이 생겨서 공격자가 침입 할 수있는 시스템 창을 만들었습니다. 당신이 멋지 3을 사용하는 경우

5

스마티 3을 사용하지 않고 문자열/평가 리소스가없는 경우 Smarty eval plugin을 사용할 수 있습니다. 사용자 지정 리소스를 만드는 것보다 문제가 훨씬 간단하다는 것을 알았습니다.

$template = "put some {$variables} in here" 
require_once($smarty->_get_plugin_filepath('function', 'eval')); 
$compiled = smarty_function_eval(array('var'=>$template), $smarty); 
+0

시간을 많이 절약 해주었습니다! – 1nstinct

3

위의 예는 저에게 맞지 않았습니다. 지금은 이전 버전의 smarty를 사용하고 있기 때문일 수 있습니다. 우리를 위해 일했다 해결책은 다음과 같은 라인을 포함 우리가 eval.tpl라는 템플릿을 만드는 것이 었습니다 : 우리는 문자열을 알아보고자 할 때 다음

{eval var=$string} 

을, 우리는 단순히 다음을 사용할 수

$smarty->assign('string', $string); 
$result = $smarty->fetch('eval.tpl'); 
+0

어떤 버전을 사용하고 있는지 알고 싶습니다. –

+0

@RonanDejhero 어떻게 알 수 있습니까? 다른 개발자가 전에 codebase에 멋지게 추가했는데 Smarty.class.php에서 어떤 버전 번호도 볼 수 없습니다. – AntonChanning

+0

@RonanDejhero 잠깐, 실제로 클래스의 속성으로있었습니다. 버전 '2.6.18'입니다. – AntonChanning

관련 문제