XSS安全的JSONResult作为字符串



我将代码更改为不再需要此答案,但是我仍在要求好奇心的缘故。

经过大量的搜索,我发现了这个问题,其他一些人喜欢它。我一直在寻找一种方法来采用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年〜但是,由于这个问题是我在短暂搜索后能找到的最好的问题,因此我不得不自己寻找一个答案,就像其他许多包含手持手动的消息来源或忽略了这个问题完全..是的,我想要一个死灵法师徽章。

最新更新