# ランタイムオプション
関数`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以降): 親オブジェクトのメソッドである場合に許可されるプロパティ名の文字列とブール値のマップ。未定義の値は、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 (新しいウィンドウで開きます)を使用して、express-handlebars (新しいウィンドウで開きます)など、ランタイムオプションを渡すことができない場合に、4.5.3の動作に戻すこともできます。