編輯:偉大的點周圍,專門的模板語言顯然是要走的路。謝謝!使用PHP作爲模板語言
我寫了這個快速課程,通過PHP做模板 - 我想知道如果我曾經爲用戶打開模板(不是直接的計劃,而是走在路上),這是否容易被利用。
class Template {
private $allowed_methods = array(
'if',
'switch',
'foreach',
'for',
'while'
);
private function secure_code($template_code) {
$php_section_pattern = '/\<\?(.*?)\?\>/';
$php_method_pattern = '/([a-zA-Z0-9_]+)[\s]*\(/';
preg_match_all($php_section_pattern, $template_code, $matches);
foreach (array_unique($matches[1]) as $index => $code_chunk) {
preg_match_all($php_method_pattern, $code_chunk, $sub_matches);
$code_allowed = true;
foreach ($sub_matches[1] as $method_name) {
if (!in_array($method_name, $this->allowed_methods)) {
$code_allowed = false;
break;
}
}
if (!$code_allowed) {
$template_code = str_replace($matches[0][$index], '', $template_code);
}
}
return $template_code;
}
public function render($template_code, $params) {
extract($params);
ob_start();
eval('?>'.$this->secure_code($template_code).'<?php ');
$result = ob_get_contents();
ob_end_clean();
return $result;
}
}
用法示例:
$template_code = '<?= $title ?><? foreach ($photos as $photo): ?><img src="<?= $photo ?>"><? endforeach ?>';
$params = array('title' => 'My Title', 'photos' => array('img1.jpg', 'img2.jpg'));
$template = new Template;
echo $template->render($template_code, $params);
這裏的想法是,我會存儲在數據庫中的模板(PHP代碼),然後通過使用正則表達式只允許類中運行允許的方法(如果,等等)。任何人都看到一個明顯的方式來利用這個並運行任意的PHP?如果是的話,我可能會去一個模板語言如Smarty的較爲標準的路線......
你*真*不應該這樣做。有一千種方法會造成你不可避免會錯過的麻煩。試圖阻止它們中的每一個都會使模板無用。 – 2010-05-05 04:47:45
瞭解,並認爲很多。這真的只是供內部使用,但是想知道我自己造就的可能性。 – Kunal 2010-05-05 04:50:35
只要注意,Smarty並不完全安全(http://www.smarty.net/manual/en/language.function.php.php)。 – tadamson 2010-05-05 05:25:32