怎么分析Nodejs中模板引擎渲染原理与潜在隐患探讨,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
一、背景
此前,实验室成员在对Nodejs原型链污染漏洞进行梳理时,发现原型链污染漏洞可结合模板引擎的渲染达到远程命令执行的效果。为什么原型链污染能结合模板引擎能达到这样的效果?模板引擎究竟是如何工作的?除了原型链污染,还有其他方式也能达到同样的效果吗?带着这样的疑问,实验室成员决定对Nodejs模板引擎的内在机制进行一些探索。
二,Nodejs模板引擎现状
目前JavaScript生态圈里面的模板引擎非常之多,各引擎的实现原理及特性都不尽相同,很难找到一款功能丰富,书写简单,前后端共用的模板引擎,因此有开发者设立了一个根据不同需求挑选不同引擎的网站garann.github。io/template-chooser。
渲染结果如下,将message对应的值test渲染进模板中。
在render函数中,除了这两个参数之外,多数模板引擎还提供了可控制渲染特性的参数options,用来对模板对渲染特性进行控制,比如是否开启调试功能,是否开启缓存机制,是否打印报错信息,以ejs为例, 可通过设置compileDebug来开启调试语句。
四、引擎渲染机制
基本上所有模板引擎的渲染机制都包含两个步骤:
步骤一:根据模板数据进行定位与分割,根据各模板定义的特殊符号找到要被替换的数据。
步骤二:根据提供的键值对和定位的结果进行值的替换、拼接,最终得到渲染的结果。
在本次的分析中,无恒实验室主要对Mustache和ejs两种引擎的渲染机制进行阐述,其他引擎的渲染过程大致相同。
4.1 定位
大多数渲染引擎都规定了要被替换的数据必须被某些符号所包裹,比如Mustache默认的符号是 {{ }} ,而ejs默认的符号是<%=%>,因此引擎在工作时,首先要在传入的模板字符串中寻找到这些特殊符号。这一步不同引擎实现方式不同,如Mustache,Nunjucks是通过词法解析也就是采用字符扫描的方式对模板字符串进行扫描,从而定位特殊符号的位置,以如下Mustache的渲染代码为例:
Mustache相应的定位代码如下,其中scanner负责对模板字符串进行扫描,扫描的结果为会存入多个token对象中。