4

これを処理する最善の方法がわかりません。インデックス ビューに、 に含まれるメッセージを表示しますTempData["message"]。これにより、別のアクションから来たときに特定のエラーまたは情報メッセージをユーザーに表示できます (たとえば、ユーザーがアクセス権を持っていないときに編集アクションに入ろうとすると、次のメッセージでインデックスに戻されます)。 「このデータを編集する権限がありません」)。

メッセージを表示する前に、 を実行しますHtml.Encode(TempData["message"])。ただし、最近、長いメッセージの場合、改行(<br>)で行を区切ることができるようにしたいという問題が発生しました。残念ながら (そして明らかに)、<br>によってエンコードされるHtml.Encodeため、実際の改行は発生しません。

Html エンコードされた文字列で改行を正しく処理するにはどうすればよいですか?

4

5 に答える 5

7

私が見た最も簡単な解決策は次のとおりです。

@MvcHtmlString.Create(Html.Encode(TempData["message"]).Replace(Environment.NewLine, "<br />"))

Razor ビューを使用している場合、通常は Html.Encode を呼び出す必要はありません。デフォルトでは、Razor html はすべての出力をエンコードします。 Razor を紹介する Scott Gu のブログから:

デフォルトでは、@ ブロックを使用して発行されたコンテンツは自動的に HTML エンコードされ、XSS 攻撃のシナリオからより適切に保護されます。

于 2011-07-21T20:31:18.063 に答える
3

参考までに、Microsoft Web Protection Library(別名Microsoft AntiXSS Library)の開発者は、アセンブリを壊して、機能していた以前のすべてのバージョンをプルしたようです。現在の状態では、もはや実行可能なソリューションではありません。コメントを読む前に、私はこの問題の解決策としてそれを見ていました。最新リリースの現在の18の評価はすべて否定的であり、開発者からの更新がないために壊れていると不平を言っているので、私はそれを試しませんでした。

Razorを使用しているので、@ICodeForCoffeeのソリューションを使用しました。シンプルでとてもうまくいくようです。改行のある潜在的に長い説明を取り、改行がページに表示されるようにフォーマットする必要がありました。

完全を期すために、これが私が使用したコードです。これは、ビューのモデルの説明フィールドを使用するように変更された@ICodeForCoffeeのコードです。

@MvcHtmlString.Create(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
于 2012-08-24T21:58:00.377 に答える
3

@Rogerのコメントに同意します-完全に制御できるものをエンコードする必要は実際にはありません。

申し訳ありませんが (悪いことではありません) それでも安全を確保したい場合は、Microsoft AntiXss ライブラリを使用して.GetSafeHtmlFragment(input)メソッドを使用できます - Anti-XSS ライブラリの HTML サニタイズを参照してください。

例えば

<%= AntiXss.GetSafeHtmlFragment(TempData["message"]) %>
于 2010-10-04T21:51:13.600 に答える
0

これを試して:

StringBuilder sb = new StringBuilder();

foreach(string message in messages)
{
sb.Append(string.Format("{0}<br />", Server.HtmlEncode(message));
}

TempData["message"] = sb.ToString();
于 2010-10-04T20:37:54.640 に答える
0

コントローラーでメッセージを「処理」します。

  1. メッセージをHTMLエンコードする
  2. 改行タグを挿入する
  3. TempData コレクションにメッセージを追加します。
于 2010-10-04T20:27:08.387 に答える