# 运行时选项

函数 'Handlebars.compile' 和 'Handlebars.precompile' 创建一个函数。 该函数可以调用为 template(context, options),其中 context 是输入对象。

options 是一个可以具有以下任意属性的对象

  • data 传入一个对象来定义自定义 @variable 私有变量。
  • helpers 除了全局定义的辅助程序之外,还可以传入自定义辅助程序。
    在模板执行期间,此对象中定义的值将替换全局对象中定义的任何值。
  • partials 除了全局定义的部分之外,传入还提供自定义部分。
    在模板执行期间,此对象中定义的值将替换全局对象中定义的任何值。
  • allowCallsToHelperMissing(自 4.3.0 起,不安全): 如果设置为 true,则允许 {{helperMissing}}{{blockHelperMissing}} 等调用。 请注意,这允许模板作者在运行 Handlebars 的环境中制作用于远程执行代码的模板(参见 https://github.com/handlebars-lang/handlebars.js/issues/1558)

# 控制原型访问的选项:

从 4.6.0 版本开始,Handlebars 默认禁止访问上下文对象的原型属性和方法。 原因是这种可能性引起的各种安全问题。 以下选项可用于控制此访问。

使用这些属性可能会打开安全漏洞。

允许原型属性可能允许模板作者在运行 Handlebars 的计算机上执行任意代码。 即使有一些限制,攻击者也可能会伪造 Handlebars 模板来导致计算机崩溃。

详细信息可以在 npm-security Advisory 755 (opens new window)1164 (opens new window)1316 (opens new window)1324 (opens new window)1325 (opens new window) 以及 Mahmoud Gamal (opens new window) 的博客文章中找到。

  • allowProtoMethodsByDefault(自 4.7.0 起): 一个布尔值(默认值: false),定义默认情况下在对象原型上定义的方法是否应该可解析。

    禁止方法 constructor__defineGetter____defineSetter____lookupGetter____lookupSetter__,即使该选项设置为 true。 仅当 allowedProtoMethods 中的相应键设置为 true 时才能访问它们。

    将此选项设置为任何值都会在尝试并禁止原始方法访问时禁用 Handlebars 写入控制台的警告。

  • allowedProtoMethods(自 4.6.0 起): 如果属性名称是父对象的方法,则允许使用属性名称的字符串到布尔值映射。 未定义的值恢复 allowProtoMethodsByDefault 中定义的值。

  • allowProtoPropertiesByDefault(自 4.7.0 起): 一个布尔值(默认值: false),定义默认情况下在对象原型上定义的非方法属性是否应该可解析。

    即使此选项设置为 true,属性 __proto__ 也是被禁止的。 只有将 allowedProtoProperties 中对应的键设置为 true 才能访问。

    将此选项设置为任何值都会在尝试并禁止原始属性访问时禁用 Handlebars 写入控制台的警告。

  • allowedProtoProperties(自 4.6.0 起): 属性名称的字符串到布尔值映射,如果它们是父对象的属性但不是方法,则允许使用它们。 未定义的值恢复为 allowProtoPropertiesByDefault 中定义的值

    const template = handlebars.compile("{{aString.trim}}");
    const result = template({ aString: "  abc  " });
    // result is empty, because trim is defined at String prototype
    
    const template = handlebars.compile("{{aString.trim}}");
    const result = template(
      { aString: "  abc  " },
      {
        allowedProtoMethods: {
          trim: true
        }
      }
    );
    // result = 'abc'
    

如果你无法传递运行时选项(例如 express-handlebars (opens new window)),你还可以使用包 @handlebars/allow-prototype-access (opens new window) 恢复到 4.5.3 行为。

Last Updated: 2023/9/14 11:12:03