web-dev-qa-db-ja.com

HTML.Encode、ただし改行は保持

ユーザー入力をテキスト領域に取り込み、保存して、最終的にユーザーに表示します。

私の見解(カミソリ)では、このようなことをしたい...

@Message.Replace("\n", "</br>")

デフォルトではRazor Html Encodesであるため、これは機能しません。これは素晴らしいですが、改行が必要です。

これを行うと、XSSの問題が発生します。

@Html.Raw(Message.Replace("\n", "</br>"))

この状況に対処する正しい方法は何ですか?

39
BZink

HttpUtility.HtmlEncodeを使用して、置換を行います。

@Html.Raw(HttpUtility.HtmlEncode(Message).Replace("\n", "<br/>"))
49

これを複数回使用している場合は、次のようにカスタム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を追加する必要があることに注意してください。

13
Tony Borres

メッセージをエンコードして、そのまま表示することができます。何かのようなもの:

@Html.Raw(Server.HtmlEncode(Message).Replace("\n", "<br/>"))
9

AntiXssEncoder.HtmlEncodeを使用する人向け

AntiXssEncoder.HtmlEncodeは/ r/n文字を&#13;&#10;にエンコードするため、ステートメントは

_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace("&#13;&#10;", "<br/>");
1
CodeSi

私の場合、文字列にはエンコードしたいhtmlが含まれていましたが、HTMLの改行もそのままにしておく必要がありました。以下のコードは、HTMLの改行を\ nに変え、すべてをエンコードします。次に、\ nのすべてのインスタンスをHTML改行に戻します。

@Html.Raw(HttpUtility.HtmlEncode(message.Replace("<br/>", "\n").Replace("<br />", "\n")).Replace("\n", "<br/>"))
0
Dave Lucre