Skip to content

安全

Handlebars 用模板和数据生成输出。应将模板、输入数据、已注册的助手、局部模板和运行时配置都视为应用程序安全边界的一部分。

在浏览器中渲染 HTML

默认情况下,Handlebars 会对通过 {{expression}} 渲染的值进行 HTML 转义。这可以防止插入 HTML 标记的文本被当作 HTML 解释:

handlebars
<p>{{comment}}</p>

不要对不受信任的内容使用三花括号表达式({{{expression}}}),也不要返回 Handlebars.SafeString。它们会禁用转义,并可能导致跨站脚本(XSS)漏洞。如果助手返回 HTML,必须先转义所有不受信任的值,再将结果标记为安全。

HTML 转义与上下文相关。它不会使不受信任的数据在 JavaScript、CSS、URL 或事件处理器属性中变得安全。避免使用模板生成内联脚本或事件处理器。应针对确切的输出上下文验证和编码数据,并在将不受信任的值放入 CSS 前应用允许列表。

URL

href 或类似属性中使用时,HTML 转义不会阻止 javascript:... 这样的 URL 执行。渲染前应使用允许的协议(如 https)允许列表来净化用户提供的 URL。

内容安全策略

在浏览器中渲染 Handlebars 输出时,请使用内容安全策略(CSP)。严格的 CSP 可阻止内联脚本,并限制脚本、样式、图像和其他资源可从哪些来源加载,从而降低 XSS 漏洞的影响。在浏览器中编译模板需要 CSP 的 'unsafe-eval';请使用预编译模板和仅运行时构建来避免它。避免使用 'unsafe-inline'。CSP 是纵深防御措施,不能替代对不受信任内容的转义和净化。

在服务器上编译和渲染模板

模板可以调用应用程序公开的助手和局部模板,并渲染你提供的数据。除非确有需要,不要让模板访问机密信息或具有特权的应用程序对象。保持渲染上下文精简,并使用行为范围狭窄且定义明确的助手。助手必须验证其参数,且不得将模板输入转换为任意的文件、网络、数据库或命令访问。

保持 Handlebars 为最新版本,并审查应用程序使用的运行时选项。不要放宽原型属性访问控制,也不要启用 allowCallsToHelperMissing。这些选项可能允许模板作者通过模板可访问的对象执行意外代码。

用户提供的模板

从资源消耗的角度看,用户模板是不受信任的程序。深度嵌套的模板、重复的局部模板或执行大规模迭代的模板可能消耗大量 CPU、内存或输出空间。即使模板不能执行任意 JavaScript,也可能导致拒绝服务。

当用户可以提交模板时,请在处理前后实施限制:

  • 在应用程序中限制模板大小、嵌套深度、局部模板递归、输入大小和渲染输出大小。
  • Handlebars 不限制迭代次数,因此应限制传递给模板的数组和对象大小。
  • 对编译和渲染设置请求超时和资源配额。
  • 对模板提交和渲染端点实施速率限制。

应在隔离的沙箱中编译和渲染用户提供的模板,例如具有严格 CPU、内存、文件系统和网络限制的独立进程或容器。不要将 Handlebars 本身视为安全沙箱。在该隔离环境中,只公开安全助手和局部模板的允许列表,传递最小化的数据对象,并且不要提供应用程序凭据或主机访问权限。

编译 AST

只能编译 Handlebars 从受信任模板源生成的 AST。编译用户提供或以其他方式不受信任的 AST 本质上不安全,绝不能这样做。精心构造的 AST 可能违反编译器的假设,并生成具有原始模板语言不允许行为的可执行 JavaScript。

MIT 许可