كيف أكتب JSON غير مشفرة إلى وجهة نظري باستخدام Razor؟

StackOverflow https://stackoverflow.com/questions/4072762

  •  28-09-2019
  •  | 
  •  

سؤال

أحاول أن أكتب كائنًا كـ JSON إلى عرض ASP.NET MVC باستخدام 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>

كيف أحصل على حلاقة تنبعث من JSON غير مشفرة؟

هل كانت مفيدة؟

المحلول

أنت تفعل:

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

في الإصدارات في وقت سابق من Beta 2 ، قمت بذلك مثل:

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

نصائح أخرى

Newtonsoft JsonConvert.SerializeObject لا يتصرف مثل Json.Encode والقيام بما يقترحه @David-K-Egghead هجمات XSS.

قم بإسقاط هذا الرمز في طريقة عرض الحلاقة لمعرفة ذلك باستخدام 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top