ユーザー入力をテキスト領域に取り込み、保存して、最終的にユーザーに表示します。
私の見解(カミソリ)では、このようなことをしたい...
@Message.Replace("\n", "</br>")
デフォルトではRazor Html Encodesであるため、これは機能しません。これは素晴らしいですが、改行が必要です。
これを行うと、XSSの問題が発生します。
@Html.Raw(Message.Replace("\n", "</br>"))
この状況に対処する正しい方法は何ですか?
HttpUtility.HtmlEncodeを使用して、置換を行います。
@Html.Raw(HttpUtility.HtmlEncode(Message).Replace("\n", "<br/>"))
これを複数回使用している場合は、次のようにカスタムHtmlHelperでラップすると便利です。
namespace Helpers
{
public static class ExtensionMethods
{
public static IHtmlString PreserveNewLines(this HtmlHelper htmlHelper, string message)
{
return message == null ? null : htmlHelper.Raw(htmlHelper.Encode(message).Replace("\n", "<br/>"));
}
}
}
その後、次のようにカスタムHtmlHelperを使用できます。
@Html.PreserveNewLines(Message)
HtmlHelperを使用するには、Helpers名前空間にusingを追加する必要があることに注意してください。
メッセージをエンコードして、そのまま表示することができます。何かのようなもの:
@Html.Raw(Server.HtmlEncode(Message).Replace("\n", "<br/>"))
AntiXssEncoder.HtmlEncodeを使用する人向け
AntiXssEncoder.HtmlEncodeは/ r/n文字を
にエンコードするため、ステートメントは
_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace(" ", "<br/>");
私の場合、文字列にはエンコードしたいhtmlが含まれていましたが、HTMLの改行もそのままにしておく必要がありました。以下のコードは、HTMLの改行を\ nに変え、すべてをエンコードします。次に、\ nのすべてのインスタンスをHTML改行に戻します。
@Html.Raw(HttpUtility.HtmlEncode(message.Replace("<br/>", "\n").Replace("<br />", "\n")).Replace("\n", "<br/>"))