4

我将我的代码更改为不再需要这个答案,但我仍然出于好奇而询问。

经过大量搜索,我发现了这个问题和其他一些人喜欢它。我一直在寻找一种方法来获取将由 JsonResult 返回的 JSON 并在视图中使用它。该答案和其他答案的问题在于它们似乎不安全。我发现的一些来源建议是这样的:

@Html.Raw(Json.Encode(Model))

首先,Json.Encode似乎不存在了。其次,如果我使用 Raw,那么不仅 JSON 语法未编码,模型内容也未编码。如果用户<script>在他们的信息中输入标签,它将以这种方式吐出并执行。如果我不使用 Raw,JSON 也会被视图编写器转义。

我想要这个的原因是因为我有一个使用一些 jQuery 模板的页面,并且在第一次加载时,我希望通过让视图输出一个触发它们的脚本标记来继续使用这些模板。

4

1 回答 1

1

这是一个非常好的观察结果,并非所有 JSON 输出都可以安全地用于 HMTL - 事实上,即使使用 Json.NET(非常棒)的默认配置也可能导致 XSS 漏洞。

无论如何,虽然没有关于此类的广告,但在上下文中的构造中使用Json.Encode安全的。(结果在使用单引号的属性中也是安全的“原始”,但不是使用双引号或不使用引号的属性。)@Html.Raw(Json.Encode(obj))<script>

这是因为Json.Encode将 \u-encoding 应用于JSON 字符串文字中的<>&'字符(它还转义了 ASCII 控制字符,因此也可以很好地处理 XML)。例如,

Json.Encode(new { hello = "\0\"\b\r\t<>&'" })

结果是

{"hello":"\u0000\"\b\r\t\u003c\u003e\u0026\u0027"}

由于Json.Encode方法仍然存在,因此可能没有正确使用包含程序集 (System.Web.Helpers) 或命名空间。

我知道这个问题已经过时 3 年了〜但由于这个问题是我经过短暂搜索后能找到的最好的问题,我不得不自己寻找答案,因为许多其他来源包含挥手或完全忽略这个问题..所以是的,我想要一个死灵法师徽章。

于 2015-12-09T23:13:33.707 回答