IT

Razor를 사용하여 인코딩되지 않은 Json을 View에 작성하는 방법

lottoking 2020. 6. 15. 08:07
반응형

Razor를 사용하여 인코딩되지 않은 Json을 View에 작성하는 방법


Razor를 사용하여 Asp.Net MVC View에 JSON으로 객체를 쓰려고합니다.

<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을 내보내도록하려면 어떻게해야합니까?


당신은 :

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

베타 2 이전 릴리스에서는 다음과 같이했습니다.

@(new HtmlString(Json.Encode(Model.PotentialAttendees)))

Newtonsoft 's JsonConvert.SerializeObjectJson.Encode@ david-k-egghead가 제안한 것과 동일하게 동작하지 않으며 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>

또한보십시오:


Newtonsoft 사용

<script type="text/jscript">
  var potentialAttendees  = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees)))
</script>

참고 URL : https://stackoverflow.com/questions/4072762/how-do-i-write-unencoded-json-to-my-view-using-razor

반응형