답변:
XSS 취약성에 노출되지 않고 CSS 공백 속성을 사용하십시오 !
<span style="white-space: pre-line">@Model.CommentText</span>
white-space: pre-wrap;
되므로 실제로 더 좋습니다 pre-line
.
다음을 시도하십시오 :
@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 />")
또한 XSS 취약성의 보안을 보장하기 위해 Razor View 개발자에게 부담을 덜어주는 이점도 있습니다.
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 Pages를 문자열로 렌더링하고 이메일을 통해 전송하기 때문에 이것을 사용합니다. 이는 공백 스타일이 항상 작동하지 않는 환경입니다.
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 />
?