3

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

4

2 回答 2

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 />
   }
 }
于 2012-11-03T18:27:37.250 回答
4

您只需要确保 HTML 的 SOURCE 不是问题。换句话说,如果您接受来自用户的 INPUT 并将其存储在您的数据库中,然后使用 Html.Raw 来显示它,那么您可能会为各种问题敞开心扉。

如果 HTML 的源被包含并且来自已知且受信任的来源,则可以大大降低风险。

从本质上讲,它归结为 HTML 的来源。使用此信息,您可以对是否要使用 @Html.Raw() 以及是否要/需要实施进一步的过滤做出最佳判断。选择取决于您,但现在您知道风险。

于 2012-11-03T18:37:23.743 回答