2012-03-20 13 views
7

वर्तमान में हम अपने एएसपी.नेट एमवीसी परियोजनाओं में से किसी एक पर कुछ एक्सएसएस मुद्दों से निपट रहे हैं। मुझे दो मुद्दे मिले - सबसे पहले हमारे अनुरोध सत्यापन पैटर्न के साथ करना है। हमलावर अब हमारे सुरक्षा में कुछ खराब सामग्री को छोड़ने के लिए इस सुरक्षा छेद का उपयोग कर सकता है।क्या मानक Html.DisplayTextFor() कोई HTML एन्कोडिंग नहीं है?

दूसरा मुद्दा यह है कि हम इस सामग्री को कैसे प्रदर्शित करते हैं और हम Html.DisplayTextFor विधि का उपयोग करते हैं और ऐसा लगता है कि यह "टूटा हुआ" है।

बस एक नया MVC 3 WebApp बनाने के लिए, HomeController में रखते:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Message = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"; 

     User foo = new User(); 
     foo.Name = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"; 

     return View(bla); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

public class User 
{ 
    public string Name { get; set; } 
} 

दृश्य:

@Html.TextBoxFor(m => m.Name) <br/> ||| <-- will be encoded 

@Html.Encode(ViewBag.Message)<br/> ||| <-- will be double encoded 

@Model.Name <br/> ||| <-- will be encoded 

@Html.DisplayTextFor(m => m.Name) <-- no encoding 
<br/> ||| 

DisplayTextFor का उत्पादन पूरी स्ट्रिंग <script xss="" src="htpp://ha.ckers.org/css.js">

प्रश्न हो जाएगा है: बग, फीचर या क्या मैं इसे गलत इस्तेमाल कर रहा हूं?

उत्तर

2

Html.DisplayTextFor वास्तव में [DisplayFormat] विशेषता (see MSDN) के साथ बातचीत करने के लिए है।

तो यदि आप इसे असुरक्षित मानों के साथ उपयोग कर रहे हैं, तो आपको इसके बारे में पता होना चाहिए और [DisplayFormat(HtmlEncode = true)] अपनी संपत्ति पर उपयोग करना होगा।

संपादित करें: ऐसा लगता है कि HtmlEncode प्रॉपर्टी वास्तव में DataAnnotationsModelMetadataProvider (और DisplayTextFor) द्वारा लागू नहीं होती है।

+0

तो अगर मैं केवल साधारण तारों को आउटपुट करना चाहता हूं, जिसमें खराब मान हो सकते हैं (और मैं डिस्प्लेफॉर्मेट विशेषता के साथ अपनी सभी संपत्तियों को सजाना नहीं चाहता), तो मुझे DisplayTextFor के बजाय बस @ Model.Name का उपयोग करना चाहिए? क्या मूल प्रकार (स्ट्रिंग/int/double/...) के लिए डिफ़ॉल्ट व्यवहार को ओवरराइड करना संभव है? –

+0

सही, 'मॉडल नाम' सरल मामलों के लिए सबसे अच्छा है। मूल प्रकारों के लिए, आप अभी भी 'ToString()' को स्पष्ट रूप से कॉल कर सकते हैं और प्रारूप या प्रारूपप्रोवाइडर निर्दिष्ट कर सकते हैं, उदा। '@ Model.Number.ToString (" N ")' – bhamlin

+0

कोई विचार क्यों है कि जब मैं [DisplayFormat (HtmlEncode = true) विशेषता का उपयोग करता हूं तो DisplayTextFor के साथ मान अभी भी एन्कोड नहीं किया जाता है? मैंने इसे अपने मॉडल में "नाम" संपत्ति पर रखा है। क्या मुझे और कुछ चाहिए? –

संबंधित मुद्दे