我将代码更改为不再需要此答案,但是我仍在要求好奇心的缘故。
经过大量的搜索,我发现了这个问题,其他一些人喜欢它。我一直在寻找一种方法来采用JSON,该方法将由JSONRESULT返回并在视图中使用它。该答案和其他答案的问题似乎是不安全的。我发现的一些消息来源提出了这样的建议:
@Html.Raw(Json.Encode(Model))
首先,Json.Encode
似乎不再存在。其次,如果我使用RAW,那么不仅是JSON语法未编码,模型内容也不是。如果用户将<script>
标签输入其信息中,它将以这种方式吐出并执行。如果我不使用RAW,那么JSON也会被视图作者逃脱。
我想要这个的原因是因为我有一个正在使用一些jQuery模板的页面,并且在第一次加载时,我仍然想通过让视图输出输出脚本标记来使用模板。
这是一个很好的观察,并非所有的JSON输出都可以安全地用于HMTL - 实际上,使用默认配置,即使json.net(很棒)可以导致XSS漏洞。
无论如何,虽然 Json.Encode
是 safe 在 <script>
上下文中使用 @Html.Raw(Json.Encode(obj))
。(结果在使用单引号的属性中也是安全的"原始",但没有使用双引号或不使用引号的属性。)
这是因为Json.Encode
在JSON字符串文字中适用于<
,>
,&
和'
字符(它也可以逃脱ASCII控件字符,因此也将与XML一起播放)。例如,
Json.Encode(new { hello = " "brt<>&'" })
导致
{"hello":"u0000"brtu003cu003eu0026u0027"}
由于Json.Encode
方法仍然存在,因此可能没有正确使用包含汇编(System.Web.Helpers)或名称空间。
我知道这个问题已经过时了3年〜但是,由于这个问题是我在短暂搜索后能找到的最好的问题,因此我不得不自己寻找一个答案,就像其他许多包含手持手动的消息来源或忽略了这个问题完全..是的,我想要一个死灵法师徽章。