# ランタイムオプション

関数`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の動作に戻すこともできます。

最終更新日: 2023/2/9 午後7:09:59