我可以用这样的断点标签安全地替换新线路吗?

时间:2012-11-03 18:17:51

标签: c# html asp.net-mvc security

我是否可以使用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方法来破坏任何互联网安全准则? 我打开这个网站是否受到任何攻击?

2 个答案:

答案 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()以及是否需要/需要实现进一步过滤。选择取决于您,但现在您知道风险。