JSONRequestBehavior को AllowGet पर सेट करते समय 'संवेदनशील जानकारी' का खुलासा किया जा सकता है


112

URLजब भी मैं अपने ब्राउज़र के एड्रेस बार से एक नया परीक्षण करता हूं, तब मुझे वही पुरानी त्रुटि मिल रही है, जब मैं returning Json(बिल्ट-इन का उपयोग कर रहा हूं MVC JsonResult helper):

इस अनुरोध को अवरुद्ध कर दिया गया है क्योंकि संवेदनशील जानकारी को तीसरे पक्ष की वेब साइटों पर प्रकट किया जा सकता है जब इसका उपयोग किया जाता है GET request। अनुमति देने के लिए GET requests, पर सेट JsonRequestBehaviorकरें AllowGet

पावती में ग्रंट के बजाय और फ़िडलर को पोस्ट अनुरोध करने के लिए आग लगाने के बजाय, इस बार, मैं वास्तव में सोच रहा हूं कि यह एक GETअनुरोध क्या उजागर POSTकरता है?

जवाबों:


82

मान लें कि आपकी वेबसाइट में एक GetUserवेब विधि है:

http://www.example.com/User/GetUser/32

जो JSON प्रतिक्रिया देता है:

{ "Name": "John Doe" }

यदि यह विधि केवल POST अनुरोधों को स्वीकार करती है, तो सामग्री केवल ब्राउज़र में वापस आ जाएगी यदि AJAX अनुरोध http://www.example.com/User/GetUser/32POST विधि का उपयोग करने के लिए किया जाता है । ध्यान दें कि जब तक आपने CORS को लागू नहीं किया है, तब तक ब्राउज़र आपके लिए यह अनुरोध करने वाले अन्य डोमेन से डेटा की सुरक्षा करेगा।

हालाँकि, यदि आपने GET अनुरोधों की अनुमति दी है, तो POST के बजाय GET के साथ उपरोक्त के समान AJAX अनुरोध करने की अनुमति देता है, एक दुर्भावनापूर्ण उपयोगकर्ता scriptHTML में टैग का उपयोग करके अपने JSON को अपनी साइट के संदर्भ में शामिल कर सकता है । इस प्रकार www.evil.com:

<script src="http://www.example.com/User/GetUser/32"></script>

यह जावास्क्रिप्ट बेकार होना चाहिए www.evil.comक्योंकि आपके वेब विधि द्वारा लौटाए गए ऑब्जेक्ट को पढ़ने का कोई तरीका नहीं होना चाहिए। हालांकि, ब्राउज़रों के पुराने संस्करणों (जैसे फ़ायरफ़ॉक्स 3) में बग के कारण, जावास्क्रिप्ट प्रोटोटाइप ऑब्जेक्ट्स को फिर से परिभाषित किया जाना संभव है www.evil.comऔर आपके डेटा को आपके विधि द्वारा वापस पढ़ना संभव है । इसे JSON अपहरण के रूप में जाना जाता है।

इसे रोकने के कुछ तरीकों के लिए इस पोस्ट को देखें । हालाँकि, यह आधुनिक ब्राउज़र (फ़ायरफ़ॉक्स, क्रोम, IE) के बाद के संस्करणों के साथ एक ज्ञात समस्या नहीं है।


25
अच्छी पोस्ट, लेकिन अगर आप नियंत्रक को एक [अधिकृत] टैग शामिल करते हैं, तो आपको सुरक्षा के बारे में चिंता करने की आवश्यकता नहीं है। आशा है कि यह कोड किसी की मदद करेगा, Json (returnMsg, JsonRequestBehavior.AllowGet)
धनुका777

17
@ धनुका777: दुर्भाग्य से सच नहीं है। CSRF हमले संभव हो सकते हैं यदि विधि के साइड इफेक्ट्स (जैसे www.example.com/User/DeleteUser/32) हैं, क्योंकि अनुरोध में प्रमाणीकरण के लिए कुकीज़ neccessary शामिल होगी क्योंकि वे पीड़ित मशीन से आ रहे हैं। [Authorize]या तो एक बहुत पुराने ब्राउज़र के मामले में आपको यहाँ हमले से नहीं बचाएगा - यह स्वयं उपयोगकर्ता है www.evil.comइसलिए अनुरोध www.evil.comकरने www.example.comपर प्राधिकरण कुकी शामिल होगी।
सिल्वरलाइटफॉक्स

1
और यदि कार्रवाई का कोई साइड इफेक्ट है तो इसे कभी भी जीईटी पद्धति का उपयोग करके लागू नहीं किया जाना चाहिए - कन्वेंशन केवल डेटा पढ़ने के लिए जीईटी का उपयोग करना है और सभी साइड-इफेक्टिंग ऑपरेशनों को POST, PUT, DELETE, आदि का उपयोग करना चाहिए। जरा सोचिए कि यह 'संवेदनशील जानकारी' त्रुटि संदेश भ्रामक है। यदि डेवलपर GET विधि का उपयोग करता है जिस तरह से इसका उपयोग किया जाना चाहिए तो सब कुछ ठीक है! :)
ps_ttf

1
मुझे यकीन नहीं है कि यह अभी भी क्या फर्क पड़ता है। यह पसंद नहीं है पोस्ट की तुलना में किसी भी अधिक संरक्षित या एन्क्रिप्टेड है। यह अभी भी सिर्फ सादा पाठ है। मैं किसी भी उपकरण के माध्यम से पोस्ट के रूप में आसानी से एक अनुरोध भेज सकते हैं और अभी भी एक ही सादा पाठ जानकारी वापस पा सकते हैं। एक दुर्भावनापूर्ण उपयोगकर्ता किसी भी सर्वर साइड कोड को आसानी से पोस्ट करने के लिए अपनी साइट पर लिख सकता है।
कम्प्यूटरीकृत

1
@Castrohenge: नहीं, क्योंकि इसके लिए एक हेडर की आवश्यकता होती है जिसे स्क्रिप्ट src के लिए GET अनुरोध के साथ नहीं भेजा जाएगा।
सिल्वरलाइटफॉक्स

111

अपने रिटर्न में निम्नलिखित का उपयोग करें:

return this.Json("you result", JsonRequestBehavior.AllowGet);

7
यह वास्तव में ओपी के सवाल का जवाब कैसे देता है? यह सब उत्तर बताता है कि हर किसी को अपवाद के आसपास कैसे जाना है ..
ईगलिजी 22

2
हाँ यह प्रयोग करें .. यह एक खाली कैच के साथ पकड़ने की कोशिश की तरह है। इससे पहले कि आप जोखिमों को समझें, इस लोगों का उपयोग न करें। -1'd
sotn

6
कम से कम परिणामों की व्याख्या किए बिना लोगों को सुरक्षा चेतावनी की अनदेखी करने के लिए कहना गैर-जिम्मेदाराना है। -1
एडुआर्डो वाडा

58

डिफ़ॉल्ट रूप से, ASP.NET MVC फ्रेमवर्क आपको JSON पेलोड के साथ GET अनुरोध का जवाब देने की अनुमति नहीं देता है क्योंकि एक मौका है कि एक दुर्भावनापूर्ण उपयोगकर्ता JSON अपहरण के रूप में जाने वाली प्रक्रिया के माध्यम से पेलोड तक पहुंच प्राप्त कर सकता है। आप GET अनुरोध में JSON का उपयोग करके संवेदनशील जानकारी वापस नहीं करना चाहते हैं।

यदि आपको एक GET के जवाब में JSON भेजने की आवश्यकता है, और संवेदनशील डेटा को उजागर नहीं कर रहे हैं, तो आप स्पष्ट JsonRequestBehavior.AllowGetरूप से Json विधि के दूसरे पैरामीटर के रूप में व्यवहार को अनुमति दे सकते हैं ।

जैसे कि

  [HttpGet] //No need to decorate, as by default it will be GET
  public JsonResult GetMyData(){  
    var myResultDataObject = buildMyData(); // build, but keep controller thin
    // delegating buildMyData to builder/Query Builder using CQRS makes easy :)
    return Json(myResultDataObject, JsonRequestBehavior.AllowGet);
  }

यहाँ फिल Haack से एक दिलचस्प लेख है JSON Hijackingकि GET विधि के साथ Json का उपयोग क्यों नहीं किया जाए


2
महान पद। अच्छा कारण है कि आपको HTTPS का उपयोग क्यों करना चाहिए।
pqsk

6
मुझे नहीं लगता कि HTTPS यहां मदद करता है।
सीन मैकमिलन

10

जब हम MVC एप्लिकेशन से क्लाइंट के लिए एक json ऑब्जेक्ट लौटना चाहते हैं, तो हमें ऑब्जेक्ट को वापस करते समय JsonRequestBehavior.AllowGet को स्पष्ट रूप से निर्दिष्ट करना चाहिए। नतीजतन, मैं इस मुद्दे को दूर करने के लिए नीचे के रूप में json डेटा लौटाता हूं:

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);

7

आपको JsonRequestBehavior.AllowGet का उपयोग इस तरह से किया जाना चाहिए:

return Json(YourObject, JsonRequestBehavior.AllowGet);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.