m.trust

もしビューのためにテンプレートを作成しているのであれば、m()を代わりに使用してください。

このメソッドは文字列に対して信用できるHTMLであるとフラグを立てます。

信用されたHTMLは、そのままレンダリングされます。そのソースは不正なマークアップであったり、そのままJavaScriptとして実行されるものである場合もありますが、この次の項目の責任は開発者が負います:

  • サニタイズされたマークアップが文字列の中に含まれる、もしくは

  • 文字列の中にどのような処理も可能なコードがある可能性があり、それに実行権限を与えることを認める。

ブラウザは、innerHTML経由でDOMに挿入された<script>タグは無視します。一度HTMLエレメントの読み込みが完了して、 innerHTML プロパティにアクセス可能になった後は、スクリプトがdocument.write("</body>")といった関数呼び出しをしたとしても、パースの段階に戻ることはありません。

このため、m.trustが自動的に<script>タグを実行することはありません。

しかし、ブラウザが非同期でスクリプトの実行を行うポイントがいくつかあります。<img><iframe>に含まれるonloadonerror属性などです。

IEはCSSの処理の中でのJavaScriptの実行を認めています。<link>/<style> タグと、style属性です。

このような実行ポイントを羅列することは、malformed(奇形)なタグと" onload="alert(1)のようなクオートが揃ってない属性文字列の組み合わせによる攻撃に対しては意味がありません。

Mithrilのテンプレートは、m.trustでマークアップを挿入するのを除けば、デフォルトではこのような攻撃を防ぐことができます。

悪意をもってユーザが入力したデータをm.trustに通す責任は開発者にあります。


使用方法

//サーバから送られてきたコンテンツとする
var content = "<h1>エラー: ユーザ名が違います</h1>";

m.render("body", [
    m("div", m.trust(content))
]);

生成される結果:

<body>
    <div>
        <h1>エラー: ユーザ名が違います</h1>
    </div>
</body>

シグニチャ

シグニチャの読み方

String trust(String html)
  • String html

    HTMLマークアップを含む文字列。

  • returns String trustedHtml

    返される文字列は文字列オブジェクトのインスタンス(文字列プリミティブではない)で、同じHTMLコンテンツと、Mithril内部で使用するフラグ属性を持つ。信頼するフラグを手で作成したり変更しないでください。

    また、文字列を結合したり、分割すると、信頼フラグは削除されます。このような操作を行う場合には、最終的な文字列に対してこの関数を呼び出す必要があります。