書籍転載:ASP.NET MVC 5 実践プログラミング

書籍転載:ASP.NET MVC 5 実践プログラミング

HTMLエンコードを無効にする - Html.Rawメソッド[Razor]

2014年10月28日

デフォルトで実行されるHTML予約文字のエスケープ処理を無効にして生のままHTMLコードを出力するためのHtml.Rawメソッドについて解説。書籍転載の14本目(基礎編「4-3-4」)。

  • このエントリーをはてなブックマークに追加

書籍転載について

 本コーナーは、秀和システム発行の書籍『ASP.NET MVC 5 実践プログラミング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 

 『ASP.NET MVC 5 実践プログラミング』の詳細や購入は秀和システムのサイト目次ページをご覧ください。

ご注意

 本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

4-3-4 HTMLエンコードを無効にする - Html.Rawメソッド

 HTMLエンコードとは、HTMLの予約文字である「<」「>」「&」のような文字を「&lt;」「&gt;」「&amp;」のような無害な文字列に置き換えることを言います。

 エンドユーザーからの入力値やデータベース/外部サービスから取得した値などを出力する上で、HTMLエンコードは欠かせません。適切なHTMLエンコードがなされていない場合、クロスサイトスクリプティング(XSS:Cross Site Scripting *16)と呼ばれる脆弱性の原因にもなるからです。

  • *16 任意の第3者によって意図しないスクリプトを実行されてしまう脆弱性です。

 もっとも、Razorを利用する上では、HTMLエンコードを意識することはあまりありません。というのも、コードナゲット構文(@...)は、指定された式に対してエンコード処理を施した上で出力するからです。

Razor
@{ ViewBag.SampleString = "That's 'All' Right, ¥"little¥" Tom!<br />"; }
@ViewBag.SampleString
リスト4-21 Views/Link/Encode.cshtml

That&#39;s &#39;All&#39; Right, &quot;little&quot; Tom!&lt;br /&gt;

 もしもRazorで文字列をエンコードせずに、そのまま出力したい場合には*17、明示的にHtml.Rawメソッドを利用してください。

  • *17 文字列が安全「な」HTMLである、もしくは、既にエンコード済みであることが判っている場合などです。
Razor
@Html.Raw(ViewBag.SampleString)
リスト4-22 Views/Link/Raw.cshtml

That's 'All' Right, "little" Tom!<br />

 より正確には、Html.Rawメソッドは戻り値としてIHtmlStringオブジェクト(エンコード済みの文字列)を返します。@...構文は、IHtmlStringオブジェクトを検出すると、これをエンコード処理せずにそのまま出力します*18

  • *18 前項のほとんどのビューヘルパーが、戻り値としてIHtmlStringの実装型であるMvcHtmlStringオブジェクトを返していたことを思い出してください。これによって、ヘルパーによって生成されたタグ文字列が、@...によってエンコードされるのを防いでいたわけです。

【Note】Html.Encode/AttributeEncodeメソッド

 明示的にエンコード処理を行うHtml.Encode/AttributeEncodeメソッドもあります。「@...」構文がある以上、ビュースクリプト上で明示的に利用するケースはほとんどありませんが、参考までに利用例のみ軽く触れておきます*19

  • *19 Rawメソッドを呼び出しているのは、二重にエンコードされるのを避けるためです。
Razor
@Html.Raw(Html.Encode(ViewBag.SampleString))
@Html.Raw(Html.AttributeEncode(ViewBag.SampleString))
HTML
That&#39;s &#39;All&#39; Right, &quot;little&quot; Tom!&lt;br /&gt;
That&#39;s &#39;All&#39; Right, &quot;little&quot; Tom!&lt;br />

 AttributeEncodeメソッドが「'」「"」「&」「<」だけをエンコード対象にしているのに対して、Encodeメソッドは(たとえば)「>」なども含めたより多くの文字をエンコードの対象としています。

※以下では、本稿の前後を合わせて5回分(第12回~第16回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

12. ルート定義からハイパーリンクを生成する - RouteLinkメソッド[Razor]

リンク先のルートパラメーターを指定したアンカータグを生成できるRouteLinkメソッドの使い方を解説。書籍転載の12本目(基礎編「4-3-2」)。

13. アプリケーションルートからの絶対パスを生成する - Url.Content/Action/RouteUrlメソッド[Razor]

リソース指定は、相対パスよりも、アプリケーションルートからの絶対パスの方がよい。そのような絶対パスを生成するUrlオブジェクトの機能を解説。書籍転載の13本目(基礎編「4-3-3」)。

14. 【現在、表示中】≫ HTMLエンコードを無効にする - Html.Rawメソッド[Razor]

デフォルトで実行されるHTML予約文字のエスケープ処理を無効にして生のままHTMLコードを出力するためのHtml.Rawメソッドについて解説。書籍転載の14本目(基礎編「4-3-4」)。

15. テンプレート関連のビューヘルパー|テンプレートの標準の挙動[Razor]

「テンプレートヘルパー」とも呼ばれるDisplayFor/EditorForメソッドについて紹介。また、テンプレートヘルパーの標準的な挙動を確認する。書籍転載の15本目(基礎編「4-4-1」)。

16. テンプレートのカスタマイズ|テンプレートを決定する方法[Razor]

テンプレートヘルパーでは、特定のデータ型/メタ情報に応じた独自のテンプレートを用意して、独自の出力を生成することもできる。その方法を解説する。書籍転載の16本目(基礎編「4-4-2」「4-4-3」)。

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社