加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

使用PHP作为模板语言

发布时间:2020-12-13 22:07:20 所属栏目:PHP教程 来源:网络整理
导读:编辑:周围的好点,专用的模板语言显然是要走的路.谢谢! 我写了这个快速课程来通过PHP进行模板化 – 我想知道如果我曾经向用户开放模板(这不是直接的计划,而是考虑下去),这是否很容易被利用. class Template {private $allowed_methods = array( 'if','switc
编辑:周围的好点,专用的模板语言显然是要走的路.谢谢!

我写了这个快速课程来通过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代码)存储在数据库中,然后通过使用正则表达式的类来运行它,只允许允许的方法(if,for等).有人看到一个明显的方法来利用这个并运行任意PHP?如果是这样的话,我可能会选择像Smarty这样的模板语言更标准的路线……

解决方法

当然..

$template_code = '<?= `rm -rf *`; ?>';

编辑:

不能马上想到任何其他事情.但是如果在同一个Template实例上多次调用渲染,你应该知道你的范围受到了损害.

例如,如果你渲染(‘<?php $this-> allowed_methods [] =“eval”;?>’)..那么Template的实例将eval作为下一个渲染的可接受函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读