我改变了我的代码,不再需要这个答案,但我仍然要求好奇心。
经过多次搜索,我发现this question和其他一些人喜欢它。我一直在寻找一种方法来获取JSONResult返回的JSON并在视图中使用它。该答案以及其他答案的问题似乎是不安全。我发现的一些消息来源建议如下:
@Html.Raw(Json.Encode(Model))
首先,Json.Encode
似乎不再存在。其次,如果我使用Raw,那么不仅JSON语法未编码,模型内容也不是。如果用户在其信息中输入<script>
标记,则会以这种方式吐出并执行。如果我不使用Raw,那么JSON也会被视图编写者转义。
我想要这个的原因是因为我有一个页面正在使用一些jQuery模板,并且在第一次加载时,我还想通过让视图输出一个触发它们的脚本标记来使用这些模板。
答案 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年〜但是因为这个问题是我在短暂搜索后能找到的最好的问题,我不得不自己寻找答案,因为许多其他来源包含挥手或忽略问题完全..所以是的,我想要一个死灵法师徽章。