web-dev-qa-db-ja.com

Razorビューでエンコードされていない文字列を送信する

ScottGuがブログで述べているように post "デフォルトでは、@ブロックを使用して送信されるコンテンツは自動的にHTMLエンコードされ、XSS攻撃シナリオからの保護が向上します。私の質問は、どのように非HTMLエンコード文字列を出力できますか?

簡単にするために、plsはこの単純なケースに固執します。

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}
78
hemme

これは私のお気に入りのアプローチです:

@Html.Raw("<p>my paragraph text</p>")

ソースはPhil HaackのRazor構文リファレンス: http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

109
miguelv

HTMLエンコードされないMvcHtmlStringの新しいインスタンスを作成できます。

@{
  var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}

Razorの将来にもっと簡単な方法があればいいのですが。

MVCを使用していない場合、これを試すことができます:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}
17
aolde

新しいHtmlStringが間違いなく答えです。

他のいくつかのかみそりの構文の変更を検討しましたが、最終的には実際に新しいHtmlStringより短いものはありませんでした。

ただし、これをヘルパーにまとめることができます。おそらく...

@Html.Literal("<p>something</p>")

または

@"<p>something</p>".AsHtml()
6
Erik Porter

プロジェクトを新しいRazorビューエンジンに移行するときにも、この問題に遭遇しました。 C#からJSONデータを生成する必要があり、ページの読み込み時にそれを出力したかったため、私が取ったアプローチは少し異なりました。

最終的に私がやったのは、cshtmlファイル内のViewに相当するRawViewを実装することでした。基本的に、生の文字列を取得するには、

@(new HtmlString(View.Foo))

// became
@RawView.Foo

これには、プロジェクトのレイアウトにいくつかの変更が必要なので、それについてのブログ投稿を書きました here 。つまり、これには、MVCのDynamicViewDataDictionaryとRawViewを含む新しいWebViewPageの実装を複製する必要がありました。また、先に進み、RawViewにインデックス演算子を実装して、

@RawView["Foo"]

誰かがキーのリストを使用してデータをループする必要があるという偶然。

Anurseのコメントを読んで、RawViewの代わりにこれをリテラルと名付けた方が良いでしょう。

0
Anh-Kiet Ngo

MonoでASP.NET MVCとRazorを使用しています。

何らかの理由でSystem.Web.MvcのSystem.Web.WebPagesからHtmlHelperを取得できませんでした。

しかし、モデルのプロパティをRazorEngine.Text.RawStringとして宣言した後、エンコードされていない文字列を出力することができました。これで、期待どおりに出力されます。

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

出力:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
0
porfirion