【问题标题】:Can I securely replace new lines with break tags like this?我可以用这样的中断标签安全地替换新行吗?
【发布时间】:2012-11-04 03:10:06
【问题描述】:

我可以像在以下扩展方法中一样将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 方法? 我打开这个网站会受到任何攻击吗?

【问题讨论】:

  • 为什么不只是一个助手,你在哪里破坏任何安全,它只是你的纯粹设计选项
  • @COLDTOLD,我主要担心的是我正在用 HTML 替换文本,然后发出 Raw 方法。我不想要任何问题。我很确定它是安全的,但我需要一些其他人的意见。谢谢你的!

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


【解决方案1】:

这不安全。以详细信息的示例文本包含:

&lt;script&gt;alert('a')&lt;/script&gt;

HTML.Raw 会将其作为脚本标签输出,浏览器将执行该脚本。如果用户提供详细信息文本,这允许他们将脚本注入您的页面(基本的 XSS 攻击)。

如果您想用&lt;br&gt; 替换换行符,请在您的视图中执行。例如,我的控制器可能如下所示:

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 />
   }
 }

【讨论】:

  • 好的,让我们沿着这条路走下去。数据实际上是由网站上的用户输入的。我正在使用 MVC 4,我如何才能简单地确保数据安全进入数据库,这样我就不必担心上述问题?
  • @BigM 您的 HtmlBreaks 扩展方法可以用 < 替换所有 和>分别,然后是 \r\n 和 \n by
    .
  • 您可以在换行符上拆分,然后在视图中附加
    的结果数组进行循环。
  • 谢谢@JohnKoerner,非常感谢!
【解决方案2】:

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

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

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

【讨论】:

  • 没错,OP没有指定要处理的字符串的来源。如果是来自不受信任来源的 HTML 内容,Koerner 的回答是必看的。另外需要注意的是,如果不同平台的用户在插入内容时,新行可以同时存储为\r\n和\n,因此每一个都需要进行一次替换。
猜你喜欢
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多