JsonRequestBehavior की आवश्यकता क्यों है?


384

क्यों Json Request Behaviorजरूरी है?

यदि मैं HttpGetअनुरोधों को अपनी कार्रवाई तक सीमित करना चाहता हूं तो मैं कार्रवाई को [HttpPost]विशेषता के साथ सजा सकता हूं

उदाहरण:

[HttpPost]
public JsonResult Foo()
{
    return Json("Secrets");
}

// Instead of:
public JsonResult Foo()
{
    return Json("Secrets", JsonRequestBehavior.AllowGet);
}

[HttpPost]पर्याप्त क्यों नहीं है ?
क्यों फ्रेम "बग" हमें JsonRequestBehavior.AllowGetहर JsonResultउस चीज़ के लिए है जो हमारे पास है। अगर मैं अनुरोधों को अस्वीकार करना चाहता हूं तो मैं HttpPostविशेषता जोड़ दूंगा ।


बहुत से मिलते-जुलते stackoverflow.com/questions/1625671/... (हालांकि मैं इस एक मेरे अपने प्रश्न के लिए :) खोज पाया जाता है)
Jedidja

क्योंकि GET को बेरोजगार माना जाता है जबकि POST को नहीं। GETs -> POST बनाकर, आप इंटरफ़ेस के शब्दार्थ को बदलते हैं।

19
क्योंकि आपका कोड बहुत साफ दिखेगा अगर आपको हर जगह crufty args नहीं जोड़ना है।
जॉन शेडलेट्स्की

जवाबों:


276

MVC DenyGetने JSON के अनुरोध को शामिल करने के लिए एक बहुत ही विशिष्ट हमले से बचाने के लिए आपकी सुरक्षा की HTTP GETसंभावना को सुधारने के लिए अनुरोध किया है कि एक्सपोज़र की अनुमति के निहितार्थ उन्हें होने देने की अग्रिम में माना जाता है।

यह बाद में विरोध किया जाता है जब बहुत देर हो सकती है।

नोट: यदि आपकी कार्रवाई विधि संवेदनशील डेटा नहीं लौटाती है, तो इसे प्राप्त करने की अनुमति देना सुरक्षित होना चाहिए।

इसके अलावा मेरी Wrox ASP.NET MVC3 पुस्तक से पढ़ना

डिफ़ॉल्ट रूप से, ASP.NET MVC फ्रेमवर्क आपको JSON पेलोड के साथ HTTP GET अनुरोध का जवाब देने की अनुमति नहीं देता है। यदि आपको एक GET के जवाब में JSON भेजने की आवश्यकता है, तो आपको JsonRequestBehavior.AllowGet को Json विधि के दूसरे पैरामीटर के रूप में उपयोग करके स्पष्ट रूप से व्यवहार की अनुमति देने की आवश्यकता होगी। हालांकि, एक मौका है कि एक दुर्भावनापूर्ण उपयोगकर्ता JSON अपहरण के रूप में ज्ञात प्रक्रिया के माध्यम से JSON पेलोड तक पहुंच प्राप्त कर सकता है। आप GET अनुरोध में JSON का उपयोग करके संवेदनशील जानकारी वापस नहीं करना चाहते हैं। अधिक जानकारी के लिए, फिल का पोस्ट http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ या इस SO पोस्ट पर देखें।

हैक, फिल (2011)। पेशेवर ASP.NET MVC 3 (प्रोग्रामर के लिए Wrox प्रोग्रामर) (जलाने स्थान 6014-6020)। Wrox। किंडल संस्करण।

संबंधित StackOverflow सवाल

अधिकांश पुनरावर्ती ब्राउज़र (फ़ायरफ़ॉक्स 21, क्रोम 27 या IE 10 से शुरू) के साथ, यह कोई अधिक भेद्यता नहीं है।


20
लेकिन सवाल यह है कि: [HttpPost] पर्याप्त क्यों नहीं है?
gdoron

4
मुझे लगता है कि यह पर्याप्त है। जब आप डेटा को HttpGet के परिणाम के रूप में पास करना चाहते हैं, तो आपको केवल AllowGet की आवश्यकता होती है। यदि आप 1 पैरामीटर के साथ Json (डेटा) को आमंत्रित करते हैं, तो DenyGet डिफ़ॉल्ट है।
danludwig

11
यह मेरा सवाल है। क्यों फ्रेम "कीड़े" हमें JsonRequestBehavior.AllowGetहर JsonResult के लिए है जो मेरे पास है। अगर मैं अनुरोध प्राप्त करने से इनकार करना चाहता हूं तो मैं HttpPostविशेषता जोड़ूंगा।
गदरॉन

35
मुझे लगता है कि ऐसा इसलिए है क्योंकि बहुत से लोग इस अस्पष्ट भेद्यता के बारे में नहीं जानते हैं। आप कहते हैं कि यदि आप अनुरोध को अस्वीकार करना चाहते हैं, तो आप इसे [HttpPost] के साथ करेंगे। हालाँकि एमवीसी लेखक आपको इस तरह के हमले के खिलाफ बॉक्स से बाहर सुरक्षा की एक परत दे रहे हैं। चूंकि आपको दूसरा तर्क जोड़ने के लिए प्रयास करने की आवश्यकता है, इसलिए आपको यह विचार करने के लिए समय लेना चाहिए कि आप किस डेटा को उजागर कर रहे हैं, और यह कितना संवेदनशील है।
danludwig

11
तो अब हम अपने एपीआई को अव्यवस्थित करते हैं और संभावित सीएलआईएनटी कमजोरियों के आसपास प्राप्त करने के लिए "रेस्टफुल" इंटरफेस में क्रिया भ्रम को जोड़ते हैं? यह भयानक लगता है ... लेकिन मैं चर्चा की सराहना करता हूं।
नॉर्मन एच

59

अपने लिए इसे आसान बनाने के लिए आप एक एक्शनफिल्टरटेरिएटर भी बना सकते हैं

public class AllowJsonGetAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var jsonResult = filterContext.Result as JsonResult;

        if (jsonResult == null)
            throw new ArgumentException("Action does not return a JsonResult, 
                                                   attribute AllowJsonGet is not allowed");

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;            

        base.OnResultExecuting(filterContext);
    }
}

और इसे अपनी कार्रवाई पर उपयोग करें

[AllowJsonGet]
public JsonResult MyAjaxAction()
{
    return Json("this is my test");
}

4
इसके अतिरिक्त, आप इसे RegisterGlobalFilters में डिफ़ॉल्ट फ़िल्टर के रूप में सेट कर सकते हैं: filter.Add (नया AllowJsonGetAttribute ())। लेकिन तब आपको अपवाद को निकालना होगा क्योंकि फ़िल्टर सभी क्रिया-विधियों के लिए लागू किया जाएगा।
वोर्टेक्स V५२४५६

8

डिफ़ॉल्ट रूप से Jsonresult "इनकार कर दो"

मान लीजिए अगर हमारे पास नीचे की तरह विधि है

  [HttpPost]
 public JsonResult amc(){}

डिफ़ॉल्ट रूप से यह "अस्वीकार करें" है।

नीचे विधि में

public JsonResult amc(){}

जब आपको अनुमति प्राप्त करने या उपयोग करने की आवश्यकता होती है, तो हमें JsonRequestBehavior.AllowGet का उपयोग करना होगा।

public JsonResult amc()
{
 return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}

5

Mvc-नियंत्रकों (केवल व्यक्तिगत क्रिया-विधियों में नहीं) पर AllowJsonGetAttribute को लागू करके @Arjen de Mooij के उत्तर पर थोड़ा सुधार करना:

using System.Web.Mvc;
public sealed class AllowJsonGetAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext context)
    {
        var jsonResult = context.Result as JsonResult;
        if (jsonResult == null) return;

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var jsonResult = filterContext.Result as JsonResult;
        if (jsonResult == null) return;

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        base.OnResultExecuting(filterContext);
    }
}

2

तुम्हे जरुरत नहीं।

यदि आपकी कार्रवाई में HttpPostविशेषता है, तो आपको इसके JsonRequestBehaviorबिना ओवरलोड को सेट करने और उपयोग करने के साथ परेशान करने की आवश्यकता नहीं है। JsonRequestBehaviorएनम के बिना प्रत्येक विधि के लिए एक अधिभार है । वे यहाँ हैं:

बिना JsonRequestBehavior

protected internal JsonResult Json(object data);
protected internal JsonResult Json(object data, string contentType);
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);

JsonRequestBehavior के साथ

protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
protected internal JsonResult Json(object data, string contentType, 
                                   JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data, string contentType, 
    Encoding contentEncoding, JsonRequestBehavior behavior);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.