Редактировать: Отличные точки вокруг, выделенный язык шаблонов, очевидно, путь. Благодаря!Использование 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 ...
Вы * действительно * не должны этого делать. Есть тысячи способов вызвать проблемы, которые вы неизбежно пропустите. Попытка блокировать все и каждого из них в любом случае сделает шаблоны бесполезными. –
Понял, и понял, как много. Это действительно только для внутреннего использования, но задавалось вопросом о возможностях эксплойта для моего собственного назидания. – Kunal
Просто отметить, Smarty не совсем безопасен (http://www.smarty.net/manual/en/language.function.php.php). – tadamson