2012-02-22 9 views
8

मेरे पास जावास्क्रिप्ट एप्लिकेशन है, जहां मैं क्लाइंट-साइड टेम्पलेट्स (underscore.js, Backbone.js) का उपयोग करता हूं। प्रारंभिक पृष्ठ लोड के लिएJson.encode विशेष प्रतीकों u003c MVC3

डाटा इस तरह पेज में तंगी है (.cshtml उस्तरा-फाइल):

<div id="model">@Json.Encode(Model)</div> 

उस्तरा इंजन बचने निष्पादित करता है, इसलिए, अगर Model

new { Title = "<script>alert('XSS');</script>" } 

है, उत्पादन में हमने:

<div id="model">{&quot;Title&quot;:&quot;\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e&quot;}</div> 

जिसके बाद "पार्स" ऑपरेशन:

var data = JSON.parse($("#model").html()); 

हम "Title" क्षेत्र वास्तव में "<script>alert('XSS');</script>" के साथ वस्तु डेटा है!

जब यह अंडरस्कोर टेम्पलेट पर जाता है, तो यह अलर्ट होता है।

किसी भी तरह \u003c- प्रतीकों की तरह उचित "<" प्रतीकों की तरह व्यवहार किया जाता है।

मैं &lt; और &gt; से डीबी से "<" प्रतीकों से कैसे बचूं (यदि वे किसी भी तरह वहां पहुंचे हैं)?

शायद मैं इन प्रतीकों से बचने के लिए Json.Encode क्रमबद्धता को ट्यून कर सकता हूं? शायद मैं Entity Framework स्थापित कर सकता हूं जिसका उपयोग मैं कर रहा हूं, डीबी से डेटा प्राप्त करते समय बिल्कुल इन प्रतीकों से बचने के लिए?

+0

यदि आप '

0

आप unencoded सामग्री लिखने के लिए चाहते हैं तो आप Html.Raw() सहायक का उपयोग करने की आवश्यकता होगी:

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

संपादित करें:

मुझे लगता है, शायद मैं समझ नहीं कर रहा हूँ तुम्हारी समस्या क्या है। एक परीक्षण नियंत्रक के भीतर उदाहरण के लिए मैं

ViewBag.Test = new { Title = "<script>alert('XSS');</script>" }; 

निम्नलिखित है संबंधित ध्यान में रखते हुए:

<script type="text/javascript"> 
     var test = @Html.Raw(Json.Encode(ViewBag.Test)); 
     console.log(test.Title); 
     document.write(test.Title); 
    </script> 

कौन सा कंसोल के लिए बारी आउटपुट में:

<script>alert('XSS');</script> 

और चेतावनी खोलता है।

+1

नहीं, वास्तव में मैं एन्कोडेड सामग्री लिखना चाहता हूं। मैं स्क्रिप्ट चलाने से बचने के लिए डीबी से "<" जैसे प्रतीकों को एन्कोड करना चाहता हूं। समस्या यह है कि, RAZOR-एन्कोडिंग-तंत्र यहां मदद नहीं करता है, जब Html.Raw का उपयोग किया जाता है, हमें यह मिलता है: {"शीर्षक": "\ u003cscript \ u003ealert (\ u0027XSS \ u0027) \ u003c/script \ u003e"} – Roman

+0

वहां अभी भी \ u003c प्रतीकों हैं जो जेएस में उचित "<" प्रतीक की तरह व्यवहार करते हैं। रेजर इंजन उन्हें एन्कोड नहीं कर सकता है। (Somewhy।) – Roman

+0

@Roman, शायद मैं आपकी समस्या को समझ नहीं पा रहा हूं क्योंकि अलर्ट परीक्षण से ठीक से काम कर रहा है, मैं अभी भाग गया? – Jesse

1

आपको अंडरस्कोर को प्रदान करने से पहले HTML के रूप में अपनी स्ट्रिंग को एन्कोड करने की आवश्यकता है।

"HTML escaping in Underscore.js templates" बताता है कि यह कैसे करें।

+0

आपके उत्तर के लिए धन्यवाद, यह एक तरीका है। लेकिन इसे हर टेम्पलेट में क्लाइंट पर हर बार इसका इस्तेमाल याद रखना होगा। मैं सर्वर पर ऐसा करने का कोई तरीका ढूंढ रहा था, शायद किसी भी तरह से serialization '(@ Json.Encode (मॉडल)) को कॉन्फ़िगर करना। – Roman