我是否可以使用Environment.NewLine
安全地替换<br />
,就像我使用以下扩展方法一样?
public static string HtmlBreaks(this string s)
{
if (string.IsNullOrEmpty(s)) { return s; }
return s.Replace(Environment.NewLine, "<br />");
}
我这样用:
@Html.Raw(Model.Details.HtmlBreaks())
让我更清楚。 这是安全的吗? 我是否通过用HTML替换文本然后发出Raw
方法来破坏任何互联网安全准则? 我打开这个网站是否受到任何攻击?
答案 0 :(得分:5)
这不安全。以包含以下内容的详细信息为例
<script>alert('a')</script>
HTML.Raw
会将其输出为脚本标记,浏览器将执行该脚本。如果用户提供详细信息文本,则允许他们将脚本注入您的页面(基本的XSS攻击)。
如果您想用<br>
替换换行符,请在视图中执行此操作。例如,我的控制器可能如下所示:
MyModel model = new MyModel();
model.Description = "Hello \r\n how are you today \r\n <script>alert('a')</script> \r\n";
return View(model);
在我看来,我可以这样做:
@{ var lines = Model.Description.Split('\r');
foreach (var line in lines)
{
@line.Trim() <br />
}
}
答案 1 :(得分:4)
您只需要确保HTML的SOURCE不是问题。换句话说,如果您正在接受用户的INPUT并将其存储在您的数据库中,然后使用Html.Raw来显示它,那么您可以为各种各样的问题敞开大门。
如果包含HTML的来源,并且来自已知且受信任的来源,则可以大大降低风险。
基本上,它归结为HTML的来源。使用此信息,您可以最好地判断是否要使用@ Html.Raw()以及是否需要/需要实现进一步过滤。选择取决于您,但现在您知道风险。