【问题标题】:ASP.NET MVC XSS protectionASP.NET MVC XSS 保护
【发布时间】:2015-07-09 09:03:23
【问题描述】:

根据OWASP XSS page,需要针对不同的上下文使用不同的 XSS 保护技术。但是,在 ASP.NET MVC Razor 视图中,我们只有 @ 符号来转义 HTML 元素内部内容上下文中的数据。 HTML 属性、CSS、javascript 上下文等呢?

HTML 元素内容

这是安全的,可以按预期工作:

<div>@data</data>

HTML 元素属性

这是不安全的,可以被利用:

<div style="background: @color"></div>

JavaScript

虽然这不安全:

<script>
    var value = @value;
</script>

安全的解决方案是:

<script>
    var value = @Json.Encode(value);
</script>

CSS

这是不安全的,可以被利用:

<style>
    .box { background : @color; } 
</style>

【问题讨论】:

  • 当他们说“上下文”时,他们并不是在谈论 Razor。Razor 只是生成 HTML。 @ 标记内的任何内容都不会在客户端上呈现(除非它是为此而设计的特定函数)。
  • 这个? wpl.codeplex.com
  • @D.Rosado 是的,AntiXSS 似乎是一个解决方案,但是“在 .NET 4.0 中,框架中包含一个版本的 AntiXSS 并且可以通过配置启用。在 ASP.NET v5 中基于白名单的编码器将是唯一的编码器”?
  • @AlexPolyankin 嘿。只是好奇你在寻找什么答案......也许我可以进一步详细说明?
  • @Gray 我已经用一些例子更新了我的答案。 AFAIK HTML 属性和 CSS 属性是这里唯一可能的漏洞。我想获得推荐和生产就绪的解决方案。我不是安全专家,但我认为在值周围使用引号并不是 100% 安全的,并且可以被利用。

标签: asp.net-mvc xss


【解决方案1】:

razor 的一大优点是它默认执行所有 HTML 编码。除非您使用@Html.Raw(),否则很难让您的页面易受攻击。您通常必须明确地将变量呈现为 html。

如果需要,您还可以使用Html.Encode()。还有HttpUtility.JavaScriptStringEncode()

关于更新的易受攻击代码:

@{var js = "alert(1);";}
<script>var value = @js</script>

我认为您使用此代码会违反规则 0。您正在将任意字符串插入脚本标记,并期望它不会被执行。实际上,我的示例出现语法错误(警告),但它仍会运行。如果你用引号括起来,你会很安全。

@{var js = "\"alert(1);";}
<script>var value = "@js"; alert(value);</script>

输出:

&quot;alert(1);

请注意,我在字符串中输入的引号被转义为&amp;quot;,使我无法跳出字符串,因此无法注入 js。 我很想看看是否有人有办法在不加引号的情况下对其进行消毒,但我持怀疑态度。

更新 2:

处理 CSS

您提供的示例不是关于转义字符串,而是更多关于将不受信任的 CSS 插入您的页面。为此,您将需要可以解析 CSS 的东西。例如,不是您希望对值进行编码,您只是希望它不包含诸如 url(javascript:)、行为、绑定等危险的东西。为此,您需要一个 CSS 过滤工具。

HTML 属性

如果你这样做,你是安全的:

<div data-color="@color"></div>

由于 razor 对引号进行编码,您将无法提前终止字符串。这就像防止 XSS 一样简单(除非 razor 中存在一些未知漏洞)。您的Json.Encode() 使用相同的想法。

但是,如果你这样做,你会做一些冒险的事情:

<div @attribute></div> 

再次重申,您在这里不需要转义字符串,您需要的东西可以过滤掉任何危险内容的属性。事实是,以这种方式做事真的很混乱,我建议不要这样做。这是一个糟糕的设计,因为它搞砸了您的关注点分离,并且难以保护您的应用免受 XSS 攻击。如果你想改变样式,你应该做的是添加 CSS 类。如果您需要根据 razor 中的变量设置属性,请使用其他内容,而不是将其注入 HTML 并希望对其进行过滤。

例如:

@{
var disabled = isDivDisabled ? "disabled" : "";
}
<div @disabled><div>

【讨论】:

  • 使用示例漏洞更新问题。
  • @AlexPolyankin 在我看来,您编写该代码违反了规则 0。您想将不受信任的代码插入到您的 javascript 中,但不运行它?嗯?把它放在引号里,然后你就没事了。我编辑了我的答案。还有什么可以去那里除了 javascript?
  • 我自己进行了研究,现在我确信 双引号和@ 足以防止 HTML 属性中的 XSS 攻击。谢谢!
  • 太棒了。感谢你的接纳。向自己证明这一点始终是学习的最佳方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多