2010-11-30 7 views
9

tengo una variable php que tiene el código html/smarty en ellaSmarty: evaluar una plantilla almacenada en una variable PHP

$x='<a href="{$link}" >{$title}</a>'; 

Estos datos se obtiene de la base de datos, quiero evaluarlo usando Smarty y poner el salida a una variable php (para imprimirla o guardarla en la base de datos de nuevo).

Gracias

Editar:

i desea que el contenido de X a ser evaluada utilizando smarty, como si el contenido de x se almacena en un file.tpl entonces $ y = $ smarty-> fetch ('file.tpl'); ... querer hacerlo sin la necesidad de guardar el contenido de x en un archivo

+0

quiero el contenido de X para evaluar el uso de sabelotodo, como si el contenido de x se almacena en un archivo.tpl luego $ y = $ smarty-> fetch ('file.tpl'); ... quiero hacerlo sin la necesidad de guardar el contenido de x en un archivo –

Respuesta

12

Si está utilizando Smarty 3, puede hacerlo fácilmente por

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

o 'eval:'.$template_string. más al respecto en el manual

2

Si te estoy siguiendo, quiere decir que la toda la cadena estaba en la base de datos, es decir, con {$ link} como parte de la cadena. No estoy seguro de qué tan inteligente funciona exactamente, pero me parece que si incluso puede hacer esto, esa cadena tendrá que ejecutar eval() en ella. (A menos que Smarty esté haciendo algo funky que me falta, de nuevo, no trabajo con smarty)

Lo que esto significa es que tienes una configuración MUY insegura aquí. Si su base de datos sufriera alguna vez una inyección SQL, su servidor podría verse comprometido.

La ejecución de estos en un archivo codificado en la aplicación no es una gran preocupación de seguridad, ya que usted tiene control sobre el código que llama .tpl, y usted tiene el control sobre .tpl. Ese es un uso 'seguro' de eval, ya que tendrías que tener un acceso serio al servidor para poder explotarlo, el tipo de acceso que sería la razón para explotarlo.

Pero una vez que accede a esos datos desde una base de datos, presumiblemente con algún tipo de sistema de administración que le permite agregar nuevas plantillas dinámicas, ha creado una ventana en su sistema en la que un atacante podría colarse.

5

Si no está utilizando Smarty 3 y no tiene el recurso string/eval, puede usar el Smarty eval plugin. Encontré esto mucho más simple que crear un recurso personalizado y mucho menos problemático.

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

Me has ahorrado mucho tiempo, gracias! – 1nstinct

3

Ninguno de los ejemplos anteriores funcionó para mí, posiblemente porque estamos usando una versión anterior de smarty en este momento. Una solución que ha funcionado para nosotros era crear una plantilla, que hemos denominado eval.tpl que contenía solamente la siguiente línea:

{eval var=$string} 

Entonces, cuando hemos querido evaluar la cadena, podríamos simplemente usamos el siguiente:

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

me gustaría saber qué versión estás usando? –

+0

@RonanDejhero ¿Cómo me entero? Otro desarrollador agregó smarty a nuestra base de código hace siglos, y no puedo ver ningún número de versión en Smarty.class.php – AntonChanning

+0

@RonanDejhero Wait, en realidad estaba allí como una propiedad de la clase. Es la versión '2.6.18'. – AntonChanning

Cuestiones relacionadas