如何使用Razor将未编码的Json写入我的视图?
我试图写一个对象作为JSON到我的Asp.Net MVC视图使用Razor,如下所示:
<script type="text/jscript"> var potentialAttendees = @Json.Encode(Model.PotentialAttendees); </script>
问题是在输出JSON编码,我的浏览器不喜欢它。 例如:
<script type="text/jscript"> var potentialAttendees = [{"Name":"Samuel Jack"},]; </script>
我如何让剃刀发出未经编码的JSON?
你做:
@Html.Raw(Json.Encode(Model.PotentialAttendees))
在早于Beta 2的版本中,您是这样做的:
@(new HtmlString(Json.Encode(Model.PotentialAttendees)))
Newtonsoft的JsonConvert.SerializeObject
与Json.Encode
行为并不一样,并且按照@ david-k-egghead的build议,可以打开XSS攻击 。
将这段代码放到Razor视图中,看看使用Json.Encode
是否安全,并且可以在JavaScript上下文中安全地使用Newtonsoft,但不是没有额外的工作。
<script> var jsonEncodePotentialAttendees = @Html.Raw(Json.Encode( new[] { new { Name = "Samuel Jack</script><script>alert('jsonEncodePotentialAttendees failed XSS test')</script>" } } )); alert('jsonEncodePotentialAttendees passed XSS test: ' + jsonEncodePotentialAttendees[0].Name); </script> <script> var safeNewtonsoftPotentialAttendees = JSON.parse(@Html.Raw(HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject( new[] { new { Name = "Samuel Jack</script><script>alert('safeNewtonsoftPotentialAttendees failed XSS test')</script>" } }), addDoubleQuotes: true))); alert('safeNewtonsoftPotentialAttendees passed XSS test: ' + safeNewtonsoftPotentialAttendees[0].Name); </script> <script> var unsafeNewtonsoftPotentialAttendees = @Html.Raw(JsonConvert.SerializeObject( new[] { new { Name = "Samuel Jack</script><script>alert('unsafeNewtonsoftPotentialAttendees failed XSS test')</script>" } })); alert('unsafeNewtonsoftPotentialAttendees passed XSS test: ' + unsafeNewtonsoftPotentialAttendees[0].Name); </script>
也可以看看:
- JsonConvert.SerializeObject的输出是否需要在Razor视图中编码?
- XSS预防规则
使用Newtonsoft
<script type="text/jscript"> var potentialAttendees = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees))) </script>
- 传递到字典中的模型项目types为“mvc.Models.ModelA”,但是此字典需要“mvc.Models.ModelB”types的模型项目
- 我如何在ASP.NET MVC中使用小写路由?
- log4net将在哪里创build这个日志文件?
- 在Windows Update之后,System.Web.Mvc无法正常工作
- 在Asp.net MVC中抛出/返回一个404 actionResult或exception,并让IIS处理它
- ASP.NET MVC:如何将视图模型转换为Json对象
- ASP.NET MVC – 附加types“MODELNAME”的实体失败,因为另一个相同types的实体已经具有相同的主键值
- 在HtmlHelper的扩展方法中从传递的lambdaexpression式获取属性值的最简单方法是什么?
- MVC自定义validation:比较两个date