मैं रेज़र का उपयोग करके अपने दृश्य में अनसेंसर्ड जोंस कैसे लिख सकता हूं?


153

मैं JSON के रूप में एक ऑब्जेक्ट को लिखने की कोशिश कर रहा हूँ मेरे Asp.Net MVC रेजर का उपयोग करके देखें, जैसे:

<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 से कैसे प्राप्त कर सकता हूं?

जवाबों:


190

तुम करो:

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

बीटा 2 की तुलना में पहले रिलीज में आपने इसे पसंद किया था:

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

3
यदि मैं अपनी वस्तुओं के गुणों में कुछ एन्कोडेड पाठ चाहता हूं तो मैं क्या कर सकता हूं? \ ", \" "UrlPart \": \ "TjcolklFX5c \", \ "शीर्षक \": \ "जब मम्मा Isn \ u0027t होम \"}, {\ "उदाहरण के लिए। यह बीकन तोड़ देगा js को लगता है कि 'बच रहा है'। var a = '' वही "" एनी आइडिया के लिए देशी स्ट्रिंग डिक्लेरेशन है।
SomeRandomName

@SomeRandomName आप इसके लिए उपयोग कर सकते हैं javascriptserializerजैसे @Html.Raw(javascriptSerializerObjecct.Serialize(myObject))
vikscool

हम 2017 में हैं, एमवीसी 5 का उपयोग कर रहे हैं और यह उत्तर अभी भी सही है!
गैब्रियल एस्पिनोज़ा

यह उत्तर एकमात्र ऐसा है जो पूरी तरह से काम करता है। धन्यवाद!
जीन-पॉल

43

न्यूटनसॉफ्ट JsonConvert.SerializeObjectऐसा व्यवहार नहीं करता है Json.Encodeऔर ऐसा करने से @ david-k-egghead आपको XSS हमलों के बारे में बताता है ।

इस कोड को रेजर व्यू में यह देखने के लिए छोड़ दें कि उपयोग Json.Encodeकरना सुरक्षित है, और यह कि न्यूटनसॉफ्ट को जावास्क्रिप्ट संदर्भ में सुरक्षित किया जा सकता है, लेकिन कुछ अतिरिक्त काम के बिना नहीं है।

<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>

यह सभी देखें:


क्या आपके पास कोई विचार है जब उन्होंने Json.Encode जोड़ा है? मुझे नहीं पता था कि वास्तव में पेज पर json डालने का एक सुरक्षित तरीका था और मुझे पता है कि मैंने अतीत में इस पर शोध किया था।
मार्च को क्रिस मैरिसिक

1
Json.Encodeजब तक मैं याद कर सकता हूं, तब तक आसपास रहा है, लेकिन नकारात्मक पक्ष यह है कि यह Microsoft के कार्यान्वयन का उपयोग करता है जो गैर-मानक तिथियों को आउटपुट करता है (और अन्य कष्टप्रद चीजें कर सकता है)। मैं न्यूटनसॉफ्ट के JsonConvert.SerializeObjectसंयुक्त उपयोग को प्रोत्साहित करता हूं और उचित रूप से भागने के साथ संयुक्त हूं क्योंकि इसमें बेहतर आउटपुट है।
जेरेमी कुक

2
खुशी है कि मैंने नीचे स्क्रॉल किया। तुरंत मैंने स्वीकृत उत्तर को देखा, मुझे उम्मीद थी कि ऐसा करने का एक सुरक्षित तरीका था।
frostymarvelous

HttpUtility.JavaScriptStringEncode संस्करण भी JSON में उद्धरण चिह्नों को कूटबद्ध करता है, इसे अवैध रूप से रेंडर करता है यदि इसका उपयोग सीधे एक स्क्रिप्ट [टाइप = 'एप्लिकेशन / json'] में किया जाता है, जो एक दया है।
पीट किरकम

1
भविष्य के स्व पर ध्यान दें: आप जो उपयोग करना चाहते हैं, वह यह है: @ Html.Raw (Json.Encode ())
पंगम्मा

12

न्यूटनसॉफ्ट का उपयोग करना

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

1
यह संभावित रूप से XSS भेद्यताओं के लिए कमजोर है जो Json.Encode को ठीक करता है, लेकिन JsonSerializerSettings.StringEscapeHandlingएन्कोडिंग को सक्षम करने के लिए आप ओवरराइड कर सकते हैं । stackoverflow.com/a/50336590/6950124
केविन सेक्रिस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.