জসনরউকয়েস্টবিহারের প্রয়োজন কেন?


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

কারণ জিইটি হ'ল আদর্শবান হওয়ার কথা যেখানে পোস্টটি নেই। জিইটি -> পোষ্ট তৈরি করে আপনি ইন্টারফেসের শব্দার্থবিজ্ঞান পরিবর্তন করেন।
রিজম

19
কারণ আপনাকে যদি কোথাও ক্রাফটি আরোগুলি যোগ না করতে হয় তবে আপনার কোডটি খুব পরিষ্কার দেখাচ্ছে।
জন শেডলেটস্কি

উত্তর:


276

থেকে MVC অক্ষমতা DenyGetআপনি একটি খুব নির্দিষ্ট তাদেরকে JSON অনুরোধ জড়িত liklihood যে যার ফলে প্রভাব উন্নত করতে হামলা রক্ষা করার জন্য HTTP GETএক্সপোজার তাদের ঘটতে করতে সক্ষম হবেন আগাম বিবেচনা করা হয়।

এটি এর পরে বিরোধিতা করে যখন খুব বেশি দেরী হতে পারে।

দ্রষ্টব্য: যদি আপনার ক্রিয়া পদ্ধতিটি সংবেদনশীল ডেটা না ফেরায় তবে তা পাওয়ার অনুমতি দেওয়া নিরাপদ হওয়া উচিত।

আমার রোকস এএসপি.নেট এমভিসি 3 বইটি থেকে আরও পঠন

ডিফল্টরূপে, এএসপি.নেট এমভিসি ফ্রেমওয়ার্ক আপনাকে জেএসএন পে-লোড দিয়ে HTTP GET অনুরোধের প্রতিক্রিয়া জানাতে দেয় না। আপনার যদি কোনও জিইটির প্রতিক্রিয়া হিসাবে জেএসএন পাঠাতে হয়, আপনাকে জসন পদ্ধতিটির দ্বিতীয় প্যারামিটার হিসাবে জসনরেকভেস্টবিভাভিয়ার.অ্যালজিটকে স্পষ্টভাবে ব্যবহারের অনুমতি দিতে হবে। তবে, এমন সম্ভাবনা রয়েছে যে কোনও দূষিত ব্যবহারকারী জেএসএন হাইজ্যাকিং নামে পরিচিত একটি প্রক্রিয়ার মাধ্যমে জেএসএন পে-লোডে অ্যাক্সেস অর্জন করতে পারে। আপনি জিইটি অনুরোধে জেএসওএন ব্যবহার করে সংবেদনশীল তথ্য ফিরিয়ে দিতে চান না। আরও তথ্যের জন্য, ফিলের পোস্টটি http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ বা এই এসও পোস্টে দেখুন।

হ্যাক, ফিল (২০১১) পেশাদার এএসপি.নেট এমভিসি 3 (ওয়ারক্স প্রোগ্রামার টু প্রোগ্রামার) (কিন্ডল লোকেশন 6014-6020)। Wrox। কিন্ডলে সংস্করণ.

সম্পর্কিত স্ট্যাকওভারফ্লো প্রশ্ন

বেশিরভাগ রিটেন্ট ব্রাউজারগুলি (ফায়ারফক্স 21, ক্রোম 27, বা আইই 10 10 দিয়ে শুরু করে) এটি আর কোনও দুর্বলতা নয়।


20
তবে প্রশ্নটি রয়ে গেছে: কেন [এইচটিটিপি পোস্ট] পর্যাপ্ত নয়?
gdoron মনিকা 24

4
আমি মনে করি এটি যথেষ্ট। আপনি যখন কেবল কোনও এইচটিপিগেটের ফলাফল হিসাবে ডেটা পাস করার অনুমতি দিতে চান তখন আপনার কেবল অলগেট প্রয়োজন। আপনি যদি 1 টি প্যারামিটার সহ জসন (ডেটা) কে আবেদন করেন তবে ডিএনজিট হ'ল ডিফল্ট।
ডানলডুইগ

11
এটা আমার প্রশ্ন। আমার JsonRequestBehavior.AllowGetকাছে থাকা প্রতিটি জসনআরসাল্টের ফ্রেমওয়ার্কটি কেন আমাদের "বাগ" করে। আমি অনুরোধ পেতে অস্বীকার করতে চাইলে আমি HttpPostগুণটি যুক্ত করব ।
জিডোরন মনিকে

35
আমি মনে করি এটি কারণ খুব বেশি লোক এই অস্পষ্ট দুর্বলতা সম্পর্কে সচেতন নয়। আপনি বলছেন আপনি যদি অনুরোধটি অস্বীকার করতে চান তবে আপনি এটি [এইচটিটিপিপোস্ট] দিয়ে করবেন। তবে এমভিসি লেখকরা আপনাকে এই ধরণের আক্রমণ থেকে রক্ষা করার জন্য বক্সের বাইরে সুরক্ষা দেওয়ার একটি স্তর দিচ্ছেন। যেহেতু আপনার ২ য় যুক্তি যুক্ত করার চেষ্টা করা দরকার, আপনি কোন ডেটা প্রকাশ করছেন এবং এটি কতটা সংবেদনশীল তা বিবেচনা করার জন্য আপনার সেই সময় নেওয়া উচিত।
ডানলডুইগ

11
সুতরাং এখন আমরা আমাদের এপিআই গুঁড়িয়ে দিচ্ছি এবং একটি সম্ভাব্য ক্লায়েন্ট চালিত দুর্বলতার আশপাশে পেতে "RESTful" ইন্টারফেসগুলিতে ক্রিয়া বিভ্রান্তি যুক্ত করি? এটি ভয়ানক মনে হচ্ছে ... তবে আমি আলোচনার প্রশংসা করি।
নরম্যান এইচ

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
অতিরিক্ত হিসাবে, আপনি এটিতে রেজিস্টারগ্লোবাল ফিল্টারগুলিতে ডিফল্ট ফিল্টার হিসাবে সেট করতে পারেন: ফিল্টারগুলি.এড করুন (নতুন AllowJsonGetAttribute ())। তবে তারপরে আপনাকে ব্যতিক্রমটি সরিয়ে ফেলতে হবে যেহেতু ফিল্টারটি সমস্ত ক্রিয়া-পদ্ধতির জন্য প্রয়োগ করা হবে।
ঘূর্ণি 852456

8

ডিফল্টভাবে জসোনারসাল্ট "পেতে অস্বীকার করুন"

ধরুন আমাদের যদি নীচের মতো পদ্ধতি থাকে

  [HttpPost]
 public JsonResult amc(){}

ডিফল্টরূপে এটি "অস্বীকার করুন"।

নীচের পদ্ধতিতে

public JsonResult amc(){}

আপনার যখন অনুমতি দিতে বা ব্যবহারের দরকার হয়, তখন আমাদের জসনরেক্সেস্টবেভিওর Aঅ্যালজিট ব্যবহার করতে হবে।

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

5

এমভিসি-কন্ট্রোলারদের (কেবল স্বতন্ত্র ক্রিয়া-পদ্ধতি নয়) প্রযোজ্য 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এনাম ছাড়াই প্রতিটি পদ্ধতির জন্য একটি ওভারলোড রয়েছে । এখানে তারা:

JsonRequestBehaviour ছাড়া

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

জসনরেকভেস্ট বিহেভিয়ার সহ

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.