Как мне написать некодированный Json в мой вид с помощью Razor? - PullRequest
144 голосов
/ 01 ноября 2010

Я пытаюсь записать объект в виде JSON в свой Asp.Net MVC View с использованием Razor, например:

<script type="text/javascript">
  var potentialAttendees = @Json.Encode(Model.PotentialAttendees);
</script>

Проблема в том, что в выводе кодируется JSON, а мой браузерэто не нравитсяНапример:

<script type="text/javascript">
    var potentialAttendees = [{&quot;Name&quot;:&quot;Samuel Jack&quot;},];
</script>

Как заставить Razor выдавать незашифрованный JSON?

Ответы [ 3 ]

185 голосов
/ 01 ноября 2010

Вы делаете:

@Html.Raw(Json.Encode(Model.PotentialAttendees))

В выпусках, предшествующих Beta 2, вы делали это так:

@(new HtmlString(Json.Encode(Model.PotentialAttendees)))
40 голосов
/ 18 апреля 2014

Newtonsoft JsonConvert.SerializeObject не ведет себя так же, как Json.Encode, и выполнение того, что предлагает @avid-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>

Смотри также:

11 голосов
/ 16 сентября 2013

Использование Newtonsoft

<script type="text/jscript">
  var potentialAttendees  = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees)))
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...