npm 包 secure-handlebars 使用教程

阅读时长 6 分钟读完

前言

Handlebars 是一个 JavaScript 模板引擎,能够将模板和数据融合生成 HTML 内容。在前端开发中,Handlebars 很常用,但是 Handlebars 在渲染模板函数时会自动对 HTML 实体字符进行编码,为了防止 XSS 攻击,secure-handlebars 正是为此诞生的。

secure-handlebars 是一个类似 Handlebars 的模板引擎,并强制要求所有的 HTML 实体字符都必须经过编码,从而防止 XSS 攻击。本篇文章将为大家介绍 secure-handlebars 的使用方法,并带领大家深入探究为什么需要编码,以及 secure-handlebars 的编码方式。

为什么需要编码

XSS,即跨站脚本攻击,是一种常见的 Web 攻击手段。攻击者通过注入恶意脚本,获取用户敏感信息或进行 CSRF 攻击,这对用户信息的保护带来了极大的威胁。而攻击者常用的注入渠道,则是 Web 页面中的用户数据输入框。

因此,前端需要对所有可能被注入的数据进行处理,以避免出现 XSS 攻击。而 HTML 实体编码就是前端处理 XSS 攻击的重要手段之一。

例如,有如下一段代码:

如果攻击者将 name 属性值注入以下内容:

那么渲染后,该 input 标签的代码为:

攻击者就通过注入代码成功执行了一个弹窗操作。而如果我们对注入的内容进行 HTML 实体编码处理,则注入代码无法执行:

这就是编码的重要性。而 secure-handlebars 正是通过编码方式来保证所有注入的数据都不会被 XSS 攻击利用。

安装

通过 npm 安装 secure-handlebars:

使用方法

我们来看一个最简单的例子:

我们采用 require 的方式引用 secure-handlebars 模块,并进行模板渲染。可以发现,secure-handlebars 将模板数据中的 <script> 标签进行了 HTML 实体字符编码,避免了 XSS 攻击。</p> <p>如下是更加详细的示例代码:</p> <h3>引用模块</h3> <p>我们先引入 secure-handlebars 模块:</p> <pre class="prettyprint login js">const secureHandlebars = require(&apos;secure-handlebars&apos;)</pre><h3>编译模板</h3> <p>secure-handlebars 提供了类似 Handlebars 的模板功能,我们可以通过下面的方式模拟模板字符串:</p> <pre class="prettyprint login js">const templateString = ` &lt;div&gt; &lt;h2&gt;{{ title }}&lt;/h2&gt; &lt;p&gt;{{ content }}&lt;/p&gt; &lt;/div&gt; `</pre><p>然后使用 secureHandlebars.compile() 方法编译模板:</p> <pre class="prettyprint login js">const template = secureHandlebars.compile(templateString)</pre><h3>渲染模板</h3> <p>准备好了模板和数据之后,我们就可以通过 secureHandlebars 方法进行模板渲染:</p> <pre class="prettyprint login js">const templateData = { title: &apos;标题 &lt;script&gt;alert(1)&lt;/script&gt;&apos;, content: &apos;正文 &lt;img src=&quot;http://onerror=alert(1)&quot;&gt;&apos; } const htmlString = template(templateData) console.log(htmlString)</pre><p>打印结果如下:</p> <pre class="prettyprint login html">&lt;div&gt; &lt;h2&gt;标题 &amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;&lt;/h2&gt; &lt;p&gt;正文 &amp;lt;img src=&amp;quot;http://onerror=alert(1)&amp;quot;&amp;gt;&lt;/p&gt; &lt;/div&gt;</pre><h2>支持的编码方式</h2> <p>secure-handlebars 支持以下几种编码方式:</p> <h3>HTML 实体字符编码</h3> <p>一般来说,对于正常的字符都是直接输出,而对于特殊字符需要进行 HTML 实体编码。secure-handlebars 即是采用这种编码方式。例如,字符 < 经过 HTML 实体编码为 &lt;。</p> <p>secure-handlebars 支持的 HTML 实体字符编码方式如下:</p> <table> <thead> <tr> <th>实体编码</th> <th>字符</th> </tr> </thead> <tbody><tr> <td>&amp;</td> <td>&</td> </tr> <tr> <td>&lt;</td> <td><</td> </tr> <tr> <td>&gt;</td> <td>></td> </tr> <tr> <td>&quot;</td> <td>"</td> </tr> <tr> <td>&#39;</td> <td>'</td> </tr> <tr> <td>&nbsp;</td> <td>空格</td> </tr> <tr> <td>&copy;</td> <td>版权符</td> </tr> <tr> <td>&reg;</td> <td>注册符</td> </tr> </tbody></table> <h3>URI 编码</h3> <p>URI 编码是将 URI 中的非法字符进行编码,例如字符 / 在 URI 中是具有特殊含义的,需要进行编码。secure-handlebars 支持 URI 编码,可以使用 {{uri ""}} 对 URI 进行编码。</p> <h3>JavaScript 字符串编码</h3> <p>secure-handlebars 还支持 JavaScript 字符串编码方式,将字符串中的特殊字符进行编码,例如单引号、双引号、反斜杠等。可以使用 {{js ""}} 进行 JavaScript 字符串编码。</p> <h2>结论</h2> <p>本篇文章为大家详细介绍了 secure-handlebars 的使用方法,以及为什么要进行 HTML 实体编码,希望大家能够从中学到技术深度,并进一步保护用户的个人信息安全。</p> <blockquote> <p>来源:<a href="https://www.javascriptcn.com/post/600672683660cf7123b36635">JavaScript中文网</a> ,转载请注明来源 <a href="https://www.javascriptcn.com/post/600672683660cf7123b36635">https://www.javascriptcn.com/post/600672683660cf7123b36635</a></p> </blockquote>

纠错
反馈