書籍転載:ASP.NET MVC 5 実践プログラミング
HTMLエンコードを無効にする - Html.Rawメソッド[Razor]
デフォルトで実行される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の予約文字である「<」「>」「&」のような文字を「<」「>」「&」のような無害な文字列に置き換えることを言います。
エンドユーザーからの入力値やデータベース/外部サービスから取得した値などを出力する上で、HTMLエンコードは欠かせません。適切なHTMLエンコードがなされていない場合、クロスサイトスクリプティング(XSS:Cross Site Scripting *16)と呼ばれる脆弱性の原因にもなるからです。
- *16 任意の第3者によって意図しないスクリプトを実行されてしまう脆弱性です。
もっとも、Razorを利用する上では、HTMLエンコードを意識することはあまりありません。というのも、コードナゲット構文(@...)は、指定された式に対してエンコード処理を施した上で出力するからです。
@{ ViewBag.SampleString = "That's 'All' Right, ¥"little¥" Tom!<br />"; }
@ViewBag.SampleString
|
That's 'All' Right, "little" Tom!<br />
もしもRazorで文字列をエンコードせずに、そのまま出力したい場合には*17、明示的にHtml.Rawメソッドを利用してください。
- *17 文字列が安全「な」HTMLである、もしくは、既にエンコード済みであることが判っている場合などです。
@Html.Raw(ViewBag.SampleString)
|
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メソッドを呼び出しているのは、二重にエンコードされるのを避けるためです。
@Html.Raw(Html.Encode(ViewBag.SampleString))
@Html.Raw(Html.AttributeEncode(ViewBag.SampleString))
|
That's 'All' Right, "little" Tom!<br />
That's 'All' Right, "little" Tom!<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」)。