Ответ 1
Вы делаете:
@Html.Raw(Json.Encode(Model.PotentialAttendees))
В версиях ранее Beta 2 вы сделали это так:
@(new HtmlString(Json.Encode(Model.PotentialAttendees)))
Я пытаюсь написать объект как JSON для моего Asp.Net MVC View с помощью Razor, например:
<script type="text/javascript">
var potentialAttendees = @Json.Encode(Model.PotentialAttendees);
</script>
Проблема заключается в том, что на выходе кодируется JSON, и моему браузеру это не нравится. Например:
<script type="text/javascript">
var potentialAttendees = [{"Name":"Samuel Jack"},];
</script>
Как мне получить Razor для испускания unencoded JSON?
Вы делаете:
@Html.Raw(Json.Encode(Model.PotentialAttendees))
В версиях ранее Beta 2 вы сделали это так:
@(new HtmlString(Json.Encode(Model.PotentialAttendees)))
Newtonsoft JsonConvert.SerializeObject
не ведет себя так же, как Json.Encode
и делает то, что предлагает @david-k-egghead, открывает вам до атак XSS.
Отбросьте этот код в представление Razor, чтобы убедиться, что использование Json.Encode
является безопасным и что Newtonsoft можно сделать безопасным в контексте JavaScript, но не без дополнительной работы.
<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>
См. также:
Использование Newtonsoft
<script type="text/jscript">
var potentialAttendees = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees)))
</script>