2012-10-19 52 views
3

我改变了我的代码并不需要这个答案了,但我还是问出于好奇的缘故。XSS安全JsonResult作为字符串

经过一番搜索,我发现this question和其他几个人喜欢它。我一直在寻找一种方法来获取JsonResult返回的JSON,并在视图中使用它。这个问题和其他问题似乎是不安全的。一些消息来源,我发现建议是这样的:

所有的
@Html.Raw(Json.Encode(Model)) 

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

我想这样做的原因是因为我有一个使用jQuery的一些模板页面,并在第一次加载,我想通过让视图输出解雇他们的脚本标记仍然使用模板。

回答

0

它是不是所有的JSON输出可以安全地在HMTL用了一个很善于观察 - 事实上,即使使用Json.NET(这是真棒)的默认配置可导致XSS漏洞。

不管怎么说,有没有广告约这样,Json.Encode安全在构建@Html.Raw(Json.Encode(obj))<script>上下文中使用。 (结果也是安全的“原始”在使用单引号的属性,但不是一个使用双引号或没有引号)。

这是因为Json.Encode应用编码的U \至<>&,和在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年过时了〜但是由于这个问题是我在短时间搜索后发现的最好的问题,我不得不自己搜索一个答案,因为许多其他来源包含挥手或忽略完全发布..所以是的,我想要一个死灵法师徽章。