# 运行时选项
函数 '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 (在新窗口中打开) 中。
← (预)编译 Handlebars 运行时 →