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...
}
これは私のお気に入りのアプローチです:
@Html.Raw("<p>my paragraph text</p>")
ソースはPhil HaackのRazor構文リファレンス: http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx
HTMLエンコードされないMvcHtmlStringの新しいインスタンスを作成できます。
@{
var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}
Razorの将来にもっと簡単な方法があればいいのですが。
MVCを使用していない場合、これを試すことができます:
@{
var html = new HtmlString("<a href='#'>Click me</a>")
}
新しいHtmlStringが間違いなく答えです。
他のいくつかのかみそりの構文の変更を検討しましたが、最終的には実際に新しいHtmlStringより短いものはありませんでした。
ただし、これをヘルパーにまとめることができます。おそらく...
@Html.Literal("<p>something</p>")
または
@"<p>something</p>".AsHtml()
プロジェクトを新しいRazorビューエンジンに移行するときにも、この問題に遭遇しました。 C#からJSONデータを生成する必要があり、ページの読み込み時にそれを出力したかったため、私が取ったアプローチは少し異なりました。
最終的に私がやったのは、cshtmlファイル内のViewに相当するRawViewを実装することでした。基本的に、生の文字列を取得するには、
@(new HtmlString(View.Foo))
// became
@RawView.Foo
これには、プロジェクトのレイアウトにいくつかの変更が必要なので、それについてのブログ投稿を書きました here 。つまり、これには、MVCのDynamicViewDataDictionaryとRawViewを含む新しいWebViewPageの実装を複製する必要がありました。また、先に進み、RawViewにインデックス演算子を実装して、
@RawView["Foo"]
誰かがキーのリストを使用してデータをループする必要があるという偶然。
Anurseのコメントを読んで、RawViewの代わりにこれをリテラルと名付けた方が良いでしょう。
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 "quotes"</div>