如何保护PHP中的模板引擎免于注入

德里卡姆

我目前正在尝试在PHP中创建一个简单的模板引擎。我主要关心的是安全性,但是模板教程却没有。可以说我有一个数据库表,其中包含用户名及其描述。用户可以在此处键入任何想要的内容。

我的猜测是使用htmlspecialchars()函数来防止javascript和html注入。但是“模板代码注入”呢?如果我的模板规则是将[@key]替换为“值”,则用户可以更新其描述,该描述会干扰我的模板处理程序。使用set方法时,是否应该将“ [”,“ @”,“]”视为特殊字符并用其ascii代码替换?

template.php:

class Template {
    protected $file;
    protected $values = array();

    public function __construct($file) {
        $this->file = $file;
    }

    public function set($key, $value) {
        $this->values[$key] = $value;
    }

    public function output() {
        if (!file_exists($this->file)) {
            return "Error loading template file ($this->file).";
        }
        $output = file_get_contents($this->file);

        foreach ($this->values as $key => $value) {
            $tagToReplace = "[@$key]";
            $output = str_replace($tagToReplace, $value, $output);
        }

        return $output;
    }
}

example.tpl:

用户名:[@name]
关于我:[@info]

index.php:

include 'template.php';
$page = new Template('example.tpl');
$page->set('info', '[@name][@name][@name]I just injected some code.');
$page->set('name', 'Tom');
echo $page->output();

这将显示:

用户名:Tom
关于我:TomTomTom我刚刚注入了一些代码。

我使用的代码基于:

http://www.broculos.net/2008/03/how-to-make-simple-html-template-engine.html

秋葵

将功能更改为在不变的模板中仅搜索一次已知键:

public function output() {
    if (!file_exists($this->file)) {
        return "Error loading template file ($this->file).";
    }
    $output = file_get_contents($this->file);

    $keys = array_keys($this->values);
    $pattern = '$\[@(' . implode('|', array_map('preg_quote', $keys)) . ')\]$';

    $output = preg_replace_callback($pattern, function($match) {
        return $this->values[$match[1]];
    }, $output);

    return $output;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何保护PHP中的模板引擎免于注入

来自分类Dev

如何保护我的视频免于在WordPress模板中下载?

来自分类Dev

保护select语句免于sql注入

来自分类Dev

如何保护代码免于解构 Javascript 中的空值?

来自分类Dev

如何保护文件免于直接下载?

来自分类Dev

如何保护我的 OLED 屏幕免于老化?

来自分类Dev

如何保护udp数据包免于丢包?

来自分类Dev

保护文件免于可写目录中的rm -rf

来自分类Dev

模板引擎禁用PHP

来自分类Dev

模板引擎禁用PHP

来自分类Dev

如何在Twig中使用PHP模板引擎而不是Silex中的Twig语法

来自分类Dev

如何将Mustache模板引擎集成到Phalcon PHP应用程序中?

来自分类Dev

如何保护参数文件作为 Azure 模板中的可用模板

来自分类Dev

如何在Play Framework中更改模板引擎?

来自分类Dev

如何在Laravel叶片模板引擎中实现<optgroup>

来自分类Dev

节点JS:如何在krakenjs中设置模板引擎

来自分类Dev

如何在ExpressJS 4.0中设置Marko模板引擎

来自分类Dev

如何在Play Framework中更改模板引擎?

来自分类Dev

如何在Apache Velocity模板引擎中编译变量?

来自分类Dev

如何通过XML-RPC保护WordPress免于在DDoS atack中使用

来自分类Dev

如何在Delphi中保护代码片段免于自动格式化CTRL + D

来自分类Dev

如何保护Flash应用程序免于在运行时更改系统时间

来自分类Dev

如何保护Jinja模板处理器中的某些文件?

来自分类Dev

如何保护PHP中的配置文件?

来自分类Dev

保护用户编辑的* .desktop文件免于升级

来自分类Dev

模板模式中的保护钩

来自分类Dev

如何从Rails中的find_by_sql中的SQL注入保护查询

来自分类Dev

Laravel 如何保护自己免受 html 注入?

来自分类Dev

如何保护PHP文件

Related 相关文章

热门标签

归档