# 运行时选项

函数 '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 安全公告中找到 755 (在新窗口中打开), 1164 (在新窗口中打开), 1316 (在新窗口中打开), 1324 (在新窗口中打开)1325 (在新窗口中打开) 以及 Mahmoud Gamal (在新窗口中打开) 的博客文章。

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

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

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

  • allowedProtoMethods (自 4.6.0 起): 一个字符串到布尔值的映射,其中包含如果它们是父对象的 method 则允许的属性名称。未定义的值会恢复 allowProtoMethodsByDefault 中定义的值。

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

    属性 __proto__ 被禁止,即使此选项设置为 true。只有当 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'
    

您还可以使用包 @handlebars/allow-prototype-access (在新窗口中打开) 在您无法传递运行时选项的情况下恢复到 4.5.3 行为,例如在 express-handlebars (在新窗口中打开) 中。

上次更新: 2023 年 2 月 9 日 下午 7:09:59