bka*_*aid 234 asp.net-mvc razor asp.net-mvc-3
我有一个接受输入的textarea控件.我想稍后通过简单地使用以下方法将该文本呈现为视图:
@ Model.CommentText
这适当地编码任何值.但是,我想用换行换字符,<br />
我找不到一种方法来确保新的br标签不被编码.我尝试过使用HtmlString,但还没有运气.
Jac*_*all 647
使用CSS空白属性而不是打开自己的XSS漏洞!
<span style="white-space: pre-line">@Model.CommentText</span>
Run Code Online (Sandbox Code Playgroud)
Oma*_*mar 115
请尝试以下方法:
@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))
Run Code Online (Sandbox Code Playgroud)
根据marcind's
有关评论此相关的问题时,ASP.NET MVC团队正在实施类似的东西<%:
,并<%=
为Razor视图引擎.
我们可以将有关HTML编码的任何问题转化为有害用户输入的讨论,但已经存在足够的内容.
无论如何,要注意潜在的有害用户输入.
@MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "<br />"))
Run Code Online (Sandbox Code Playgroud)
@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))
Run Code Online (Sandbox Code Playgroud)
the*_*lem 10
Omar作为HTML Helper的第三个解决方案是:
public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
Run Code Online (Sandbox Code Playgroud)
拆分换行符(环境不可知)并定期打印 - 无需担心编码或xss:
@if (!string.IsNullOrWhiteSpace(text))
{
var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
<p>@line</p>
}
}
Run Code Online (Sandbox Code Playgroud)
(删除空条目是可选的)
将DRY 原则应用于 Omar 的解决方案,这是一个 HTML Helper 扩展:
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法(使用改进的正则表达式):
@Html.EncodedReplace(Model.CommentText, "[\n\r]+", "<br />")
Run Code Online (Sandbox Code Playgroud)
这还有一个额外的好处,即减少了 Razor View 开发人员在确保 XSS 漏洞的安全性方面的责任。
我对 Jacob 的解决方案的担忧是,使用 CSS 渲染换行符会破坏HTML 语义。
归档时间: |
|
查看次数: |
145081 次 |
最近记录: |