原生twig模板引擎详解(安装使用)
最近在学习SSTI(服务器模板注入),所以在此总结一下
0x00 Twig的介绍
什么是Twig?
Twig是一款灵活、快速、安全的PHP模板引擎。
Twig的特点?
快速:Twig将模板编译为纯粹的,最优化的PHP代码。它的开销与常规的PHP代码相比,已经降到了极低。
安全:Twig拥有沙盒模式,用于评估未受信任的模板代码。这使得Twig可以用于允许用户自行修改模板设计的应用程序中。
灵活:Twig由一个灵活的词法分析器和解析器驱动。这使得开发者可以自定义标签和过滤器,并创建自己的DSL。
为何会有这款模板引擎?
在为PHP带来模板引擎时,许多人会告诉你PHP本身就是一款模板引擎啊。虽说一开始PHP是作为一门模版语言使用,但它并不像近年来的任何模板引擎一样发展。事实上,他不支持现代模板引擎的许多特性:
1.简洁:PHP语言在涉及到输出转义时冗长而可笑。
<?php echo $var ?>
<?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?>
相比之下,Twig拥有非常简洁的语法,它使得模版更具可读性:
{{ var }}
{{ var|escape }}
{{ var|e }} {# shortcut to escape a variable #}
2.模版导向语法:Twig为通用的模式提供了快捷方式,例如在遍历一个空数组时,会显示一个默认文本:
{% for user in users %}
* {{ user.name }}
{% else %}
No users have been found.
{% endfor %}
3.全功能:Twig为你提供了轻松构建强大模版的一切:多重继承,块,自动化输出转义,以及其他许多特性:
{% extends "layout.html" %} {% block content %}
页面内容...
{% endblock %}
4.易学:Twig的语法非常易学,即使是网页设计师也能毫无阻碍地快速完成工作:
当然,PHP也是许多模板引擎项目中用到的语言。但它们中的大多数仍是使用PHP 4开发的,并且不支持最佳的web开发实践:
5.可扩展性:即使是在最复杂的情况下,Twig也足够灵活满足你的需求。得益于开放的体系,你可以实现你自己的语言结构(标签、过滤器、函数、甚至运算符等)来创建你自己的DSL。
6.已被单元测试:Twig经历过完整的单元测试,它是稳定的,能用于大型项目的。
7.文档:Twig拥有完整的文档,以及专用的在线手册,当然还有完善的API文档。
8.安全:说到安全,Twig拥有一些独特的特性:
自动输出转义:为安全考虑,你可以全局启用自动输出转义,或者只对某个块启用:
{% autoescape true %}
{{ var }}
{{ var|raw }} {# var won't be escaped #}
{{ var|escape }} {# var won't be doubled-escaped #}
{% endautoescape %}
9.沙盒:Twig可以在沙盒环境下评估任意模版,用户只能访问一组有限的标签,过滤器,以及由开发者定义的对象方法。沙盒可以全局地或者单独对某些模版启用:
{{ include('page.html', sandboxed = true) }}
10.清晰的错误信息:无论何时你在模版中遇到了语法错误,Twig都会输出带有出错的文件名和行号的帮助信息。它非常有助于调试。
11.快速:Twig的目标之一就是尽可能地快。为了尽可能实现最佳的速度,Twig将模版编译成极致优化的PHP代码。它的开销与常规的PHP代码相比,已经降到了极低。
0x01 安装
需求:
和php一样,发布大版本后,以前的版本依然会维护一段时间,因此twig目前有两个版本都在维护
1.X版本:至少PHP 5.2.7,从1.34开始至少需要PHP 5.3.3.
2.X版本:至少PHP 7.0.0
包括drupal8在内,许多项目都还在使用1.X,这里以1.X做主要介绍,有多种方法安装twig,官方推荐使用composer,运行如下命令即可:
composer require twig/twig:~1.0
为了提高性能twig还提供了有限功能的php层面的C扩展,详见官网,这里我们以下载文件方式来安装。
安装:
到这里下载文件包:https://github.com/twigphp/Twig/tags
本文选择: v1.35.3 解压下载的Twig-1.35.3.tar.gz 由于twig使用psr-0的自动加载方式,所以里面的lib就是我们需要的库文件,将其复制到网站根目录即可
你可以在本机通过phpstudy等软件安装运行环境,这里以E:\phpStudy\PHPTutorial\WWW作为网站根目录,在SSTI文件夹下创建SSTI1.php
内容如下:
1 <?php
2
3 require_once '../Twig-1.35.3/lib/Twig/Autoloader.php';
4
5 Twig_Autoloader::register();
6
7 $loader = new Twig_Loader_Array(array(
8
9 'index' => 'Hello {{ name }}!',
10
11 ));
12
13 $twig = new Twig_Environment($loader);
14
15 echo $twig->render('index', array('name' => 'Fabien'));
运行结果如图:
这说明安装完成
开始使用:
假设你已经按前一步设置好了目录与文件,我们来从文件系统加载一个模板文件,进行显示:
在根目录建立子目录“template”用以存放模板文件,在其中建立文本文件“index.html.twig”,内容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>twig</title> </head> <body> hello world ! {{name}} </body> </html>
然后访问站点http://127.0.0.1/template.php,你将会看到:
同时在站点根目录下多出了一个子目录:
templates_cache
其中存放着为提高性能编译为php文件的模板文件,默认只编译一次,如原文件发生变化需重新编译(删除缓存)
在以上代码中Twig_Environment是twig的中枢对象,类接收两个参数:
\Twig_Environment::__construct (Twig_LoaderInterface $loader = null, $options = array())
$loader是实现了\Twig_LoaderInterface接口的加载器,用于加载模板文件
$options是选项数组,控制twig行为,有效选项如下:
debug:是否处于调试模式,布尔值,默认为false
charset:模板使用的字符编码,默认为 UTF-8
base_template_class:基础模板类,用于被编译后的模板php文件,默认为Twig_Template
cache:可选值有储存编译后模板的目录,或者为false以禁用编译缓存,这是默认值,也可以是缓存对象(接口:Twig_CacheInterface的实例,见开发者篇)
auto_reload:布尔值,在原模板文件改变时是否重新加载,如果没有提供那么将根据debug选项决定
strict_variables:是否使用严格变量模式,默认为false,为真时模板中使用无效变量将抛出错误,否则为NULL
autoescape:是否全局自动转义,可能的值有:false(禁止转义),true(默认值,等效为html),html(转义html实体),js(转义js),css(转义css),url(转义url),html_attr(转义html和属性),name(基于模板扩展名设置自动转义策略),PHP callback(由一个php回调来返回转义策略,该回调接收模板的名字做参数)
optimizations:模板编译时的优化选项,“-1”代表开启全部优化(默认值),“0”代表禁用优化,还有其他值详见下集中优化扩展一节
渲染代码:$twig->render('index.html.twig', array('name' => 'yunke'));原型为:
render($name, array $context = array())
第一个参数是模板的文件名,用于加载模板
第二个是传递给模板的变量数组,键名为在模板中的变量名,键值为对应的变量值,该变量数组称为模板的“上下文”,在模板中通过“_context”能访问到该数组,下文将多次提到“上下文”就是指该变量数组
模板文件命名:
twig模板是一个段文本内容,可以存放在数据库、php变量、文件等地方,如果是文本文件,命名是任意的,任意扩展名均可,但通常使用“.twig”或“.html.twig”作为扩展名
参考:https://www.poos.cn/node/65
https://www.kancloud.cn/yunye/twig-cn/159454
原生twig模板引擎详解(安装使用)的更多相关文章
- flask中jinjia2模板引擎详解3
接上文 模板继承 Jinji2中的模板继承是jinjia2比较强大的功能之一. 模板继承可以定义一个父级公共的模板,把同一类的模板框架定义出来共享. 这样做一方面可以提取共享代码,减少代码冗余和重复的 ...
- flask中jinjia2模板引擎详解4
接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下{% extends & ...
- 构建自己的PHP框架(Twig模板引擎)
完整项目地址:https://github.com/Evai/Aier Twig 模板引擎 模版引擎 twig 的模板就是普通的文本文件,也不需要特别的扩展名,.html .htm .twig 都可以 ...
- opencart 引入 TWIG 模板引擎
1.首先将 twig 包放入 system\library 目录. 2.在 system/startup.php 文件最后添加引入语句. require_once(DIR_SYSTEM . 'lib ...
- 【转】Eclipse Java注释模板设置详解
Eclipse Java注释模板设置详解 设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后 ...
- MyIASM和Innodb引擎详解
MyIASM 和 Innodb引擎详解 Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级 ...
- 前后端数据交互处理基于原生JS模板引擎开发
json数据错误处理,把json文件数据复制到----> https://www.bejson.com/ 在线解析json 这样能直观的了解到是否是json数据写错,在控制台打断点,那里错误打那 ...
- MySQL数据库的各种存储引擎详解
原文来自:MySQL数据库的各种存储引擎详解 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...
- 【转载】 Eclipse注释模板设置详解
Eclipse注释模板设置详解 网站推荐: 金丝燕网(主要内容是 Java 相关) 木秀林网(主要内容是消息队列)
随机推荐
- 【dva】dva的基本用法
services 该文件夹用于存储services,里面的内容为接口调用函数,记得将数据返回.(request是我自己封装函数,也可以用axios原生的函数) const finishTask = { ...
- 如何在eclipse jee中检出项目并转换为Maven project
如何在eclipse jee中检出项目并转换为Maven project,最后转换为Dynamic web project 注意:该文档只针对以下eclipse版本,如图 为了方便,我将我本地的压缩包 ...
- [BUUCTF]PWN——hitcontraining_uaf
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
- [BUUCTF]PWN17——[HarekazeCTF2019]baby_rop
[BUUCTF]PWN17--[HarekazeCTF2019]baby_rop 附件 步骤: 例行检查,64位,开启了NX保护 试运行一下程序,看这个情况,当我们输入太长字符串的时候会报错 64位i ...
- Docker从入门到精通(七)——容器数据共享
什么是容器数据共享?简单来说就是容器与容器之间数据共享,容器与宿主机数据共享. 1.为什么需要数据共享? ①.数据持久化 比如我们有一个MySQL集群,通过容器启动,那么项目运行过程中的数据是保存在容 ...
- bootstrap栅格例子
<div class="container-fluid "> <div class="row"> <div class=" ...
- MySQL查询列必须和group by字段一致吗?
@ 目录 场景:查询各部门薪水最高的员工. 方法一: 方法二: MySQL group by是如何决定哪一条数据留下的? 分组前的数据: 那么target list和group by column不匹 ...
- Solon,一个轻量级的应用开发框架。发布官网喽!!!
官网发布: https://solon.noear.org/ 项目简介: Solon,是一个轻量级的应用开发框架.更快.更小.更自由! 支持JDK8+:主框架0.1Mb:组合不同的插件应对不同需求:方 ...
- Mysql中不能update自身的解决方法
不能执行:update bi_data.order_all_detailset err_msg='同时存在于wx,zfb平台',proc_time=now()where order_no in( se ...
- SpringBoot简单整合分布式任务调度平台(XXL-JOB)
官方文档:https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%8 ...