使用 Mvc Razor 字符串编码来防止 AngularJS 沙箱逃逸

Using Mvc Razor string encoding to protect against AngularJS sandbox escapes

我正在尝试了解这里的一些奇怪行为。

我将 MVC 5 与 AngularJS 版本 1.4.5 一起使用。此版本的 Angular 容易受到某些 XSS 攻击,因为您可以逃脱沙箱。

以下字符串将发出带有文本“5”的警报:

{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}

我有一个 razor 页面,Index.cshtml 包含以下 razor 代码和 HTML:

<div ng-app="">

    <div>
        @{
            var breakAngular = "{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}";
        }

        @breakAngular

    </div>
</div>

现在,razor 引擎将始终在呈现页面时对 html 进行编码,因此“{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(5)//');}}”将转换为无害的“{{&#39;a&#39;.constructor.prototype.charAt=[].join;$eval(&#39;x=1} } };alert(5)//&#39;);}}

但是,当我加载页面时,警报仍然会执行。

我希望服务器端 razor 引擎在输出之前使用攻击向量对字符串进行编码,这意味着该字符串是安全的,但在加载页面时仍会执行警报。

这就像 angular 沙箱可以以某种方式访问​​字符串并在 razor angine 有机会清理毫无意义的字符串之前对其进行解释。

我在这里遗漏了什么,有什么方法可以防止此类漏洞?

很遗憾,目前无法更新 angularJS!

更新

显然这可以防止 angularjs 沙箱逃逸。

@Html.Raw(Html.Encode(breakAngular))

Angular 文档传统上非常清楚混合客户端和服务器端模板的危险。 Razors 的默认编码是为了在某些情况下缓解 XSS,但当然不能解决所有问题,因为不同的客户端模板框架引入了不同的模板机制。

我不会将用户提供的数据放入这样的 angular 模板中。如果您需要从服务器提供数据,解决此问题的一种方法可能是将其放在 ng-app 之外,而是使用 javascript 从 DOM.