入力を受け入れるtextareaコントロールがあります。私は後でそのテキストを単にビューを使用してビューにレンダリングしようとしています:
@ Model.CommentText
これは値を適切にエンコードしています。しかし、改行文字を置き換えたいのです<br />
が、新しいbrタグがエンコードされないようにする方法が見つかりません。私はHtmlStringを使用してみましたが、まだ運がありません。
入力を受け入れるtextareaコントロールがあります。私は後でそのテキストを単にビューを使用してビューにレンダリングしようとしています:
@ Model.CommentText
これは値を適切にエンコードしています。しかし、改行文字を置き換えたいのです<br />
が、新しいbrタグがエンコードされないようにする方法が見つかりません。私はHtmlStringを使用してみましたが、まだ運がありません。
回答:
XSSの脆弱性を利用する代わりに、CSSの空白スペースプロパティを使用してください。
<span style="white-space: pre-line">@Model.CommentText</span>
white-space: pre-wrap;
は、pre-line
空白を1つのスペースにグループ化することによってテキストを混乱させるので、実際には優れています。
以下を試してください:
@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))
この関連する質問marcind's
に対するコメントによると、ASP.NET MVCチームは、Razorビューエンジンと同様の実装を検討しています。<%:
<%=
HTMLエンコーディングに関するあらゆる質問を有害なユーザー入力に関する議論に変えることができますが、それはすでに十分に存在しています。
とにかく、潜在的な有害なユーザー入力に注意してください。
@MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "<br />"))
@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))
<script>
ますか。
\n
代わりに返されるためです\r\n
DRYの原則をOmarのソリューションに適用すると、HTMLヘルパー拡張機能が次のようになります。
using System.Web.Mvc;
using System.Text.RegularExpressions;
namespace System.Web.Mvc.Html {
public static class MyHtmlHelpers {
public static MvcHtmlString EncodedReplace(this HtmlHelper helper, string input, string pattern, string replacement) {
return new MvcHtmlString(Regex.Replace(helper.Encode(input), pattern, replacement));
}
}
}
使用法(改善された正規表現を使用):
@Html.EncodedReplace(Model.CommentText, "[\n\r]+", "<br />")
これには、Razor View開発者の負担を減らして、XSSの脆弱性によるセキュリティを確保するという追加の利点もあります。
Jacobのソリューションに対する私の懸念は、CSSで改行をレンダリングするとHTMLのセマンティクスが壊れることです。
いくつかのテキストを段落( "p"タグ)に分割する必要があったので、以前の回答のいくつかの推奨事項を使用して簡単なヘルパーを作成しました(ありがとうございます)。
public static MvcHtmlString ToParagraphs(this HtmlHelper html, string value)
{
value = html.Encode(value).Replace("\r", String.Empty);
var arr = value.Split('\n').Where(a => a.Trim() != string.Empty);
var htmlStr = "<p>" + String.Join("</p><p>", arr) + "</p>";
return MvcHtmlString.Create(htmlStr);
}
使用法:
@Html.ToParagraphs(Model.Comments)
手動でマークアップを発行する必要がないため、この方法をお勧めします。これは、Razorページを文字列にレンダリングし、電子メールで送信するためです。これは、空白のスタイル設定が常に機能するとは限らない環境です。
public static IHtmlContent RenderNewlines<TModel>(this IHtmlHelper<TModel> html, string content)
{
if (string.IsNullOrEmpty(content) || html is null)
{
return null;
}
TagBuilder brTag = new TagBuilder("br");
IHtmlContent br = brTag.RenderSelfClosingTag();
HtmlContentBuilder htmlContent = new HtmlContentBuilder();
// JAS: On the off chance a browser is using LF instead of CRLF we strip out CR before splitting on LF.
string lfContent = content.Replace("\r", string.Empty, StringComparison.InvariantCulture);
string[] lines = lfContent.Split('\n', StringSplitOptions.None);
foreach(string line in lines)
{
_ = htmlContent.Append(line);
_ = htmlContent.AppendHtml(br);
}
return htmlContent;
}
\n
データベースと同じように改行が保存されていると思いますが、変換したい<br />
ですか?