XSS安全的JsonResult为字符串

时间:2012-10-19 10:55:05

标签: json asp.net-mvc-4

我改变了我的代码,不再需要这个答案,但我仍然要求好奇心。

经过多次搜索,我发现this question和其他一些人喜欢它。我一直在寻找一种方法来获取JSONResult返回的JSON并在视图中使用它。该答案以及其他答案的问题似乎是不安全。我发现的一些消息来源建议如下:

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

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

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

1 个答案:

答案 0 :(得分:1)

非常好的观察结果是,并非所有JSON输出都可以在HMTL中安全使用 - 事实上,使用甚至Json.NET(非常棒)的默认配置可能会导致XSS漏洞。

无论如何,虽然没有广告,但Json.Encode 安全要在@Html.Raw(Json.Encode(obj))的{​​{1}}中使用<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年〜但是因为这个问题是我在短暂搜索后能找到的最好的问题,我不得不自己寻找答案,因为许多其他来源包含挥手或忽略问题完全..所以是的,我想要一个死灵法师徽章。