كيف أكتب JSON غير مشفرة إلى وجهة نظري باستخدام Razor؟
-
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 = [{"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 هجمات 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>
لا تنتمي إلى StackOverflow