ASP.NET MVC A potentially dangerous Request.Form value was detected from the client when using a custom modelbinder


96

এখানে ত্রুটি পাওয়া:

ValueProviderResult value = bindingContext.ValueProvider.GetValue("ConfirmationMessage");

আমি কীভাবে কেবলমাত্র মান নির্বাচন করতে অনুমতি দেব? অর্থাত্

[ValidateInput(false)]
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    ValueProviderResult value = bindingContext.ValueProvider.GetValue("ConfirmationMessage");
    ValueProviderResult value2 = bindingContext.ValueProvider.GetValue("ConfirmationMessage2");
}

1
সম্ভাব্য বিপজ্জনক অনুরোধের সম্ভাব্য সদৃশ । ক্লায়েন্টের কাছ থেকে প্রথম মান সনাক্ত করা হয়েছিল , এটি ওয়েবফর্ম বা এমভিসি কিনা তা বিবেচনা করে না।
এরিক ফিলিপস

2
ধন্যবাদ, তবে আপনি আমার বিষয়টিকে আলাদা হিসাবে দেখেন নি
ডিডাব্লু

একই সঠিক মূল সমস্যা, কেবলমাত্র পার্থক্যটি এটির সাথে কাজ করার জন্য এমভিসি নির্দিষ্ট উপায় থাকতে পারে।
এরিক ফিলিপস

মতিন ব্যবহার করার সময়, bizzehdee উত্তর এখানে দেখতে stackoverflow.com/questions/17964313/...
পেত্র

উত্তর:


227

আপনার স্বল্প কিছু সু্যোগ আছে।

মডেলটিতে প্রতিটি বৈশিষ্ট্যে এই বৈশিষ্ট্য যুক্ত করুন যা আপনাকে এইচটিএমএল - সেরা পছন্দ হিসাবে অনুমতি দেওয়া দরকার

using System.Web.Mvc;

[AllowHtml]
public string SomeProperty { get; set; }

নিয়ন্ত্রক ক্রিয়াকলাপে সমস্ত এইচটিএমএলকে অনুমতি দেওয়ার জন্য এই বৈশিষ্ট্যটি যুক্ত করুন

[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)

ওয়েবকনফিগে বর্বর বাহিনী - অবশ্যই প্রস্তাবিত নয়

ওয়েবকনফিগ ফাইলে, ট্যাগগুলির মধ্যে, অনুরোধভ্যালিডেশনমোড = "২.০" এর সাথে httpRuntime উপাদানটি সন্নিবেশ করুন। পৃষ্ঠাগুলির উপাদানগুলিতে বৈধতাপ্রয়োগ = "মিথ্যা" বৈশিষ্ট্য যুক্ত করুন।

<configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>

আরও তথ্য: http://davidhayden.com/blog/dave/archive/2011/01/16/ এলোএইচটিএমএলটিগ্রিবিএএসপিএনইটিএমভিসি3.এএসপিএক্স

উপরেরগুলি ডিফল্ট মডেলবাইন্ডারের ব্যবহারের জন্য কাজ করে।

কাস্টম মডেলবাইন্ডার

এটি প্রদর্শিত হয় যে উপরের কোডে বাইন্ডিং কনটেক্সট.ভালিউপ্রভাইডার.গেটভ্যালু () এ কল সবসময়ই ডেটা যাচাই করে, কোনও বৈশিষ্ট্য নির্বিশেষে। এএসপি.নেট এমভিসি সূত্রগুলিতে খনন করে জানা যায় যে ডিফল্টমোডেলবাইন্ডার প্রথমে অনুরোধের যাচাইকরণের প্রয়োজন হয় কিনা তা পরীক্ষা করে এবং তারপরে বাইন্ডিং কনটেক্সটকে কল করে nঅনুপাতিতভ্যালিউপ্রভাইডার.গেটভ্যালু () পদ্ধতিটি এমন একটি পরামিতি সহ নির্দেশ করে যা বৈধতা প্রয়োজন কিনা তা নির্দেশ করে।

দুর্ভাগ্যক্রমে আমরা কোনও ফ্রেমওয়ার্ক কোড ব্যবহার করতে পারি না কারণ এটি সিলযুক্ত, ব্যক্তিগত বা বিপজ্জনক জিনিসগুলি করা থেকে অজ্ঞানীদের বাঁচানোর জন্য যা কিছু আছে, তবে AllowHtml এবং ValidateInput বৈশিষ্ট্যগুলিকে সম্মান করে এমন একটি কার্যকর কাস্টম মডেল বাইন্ডার তৈরি করা খুব কঠিন নয়:

public class MyModelBinder: IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        // First check if request validation is required
        var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

        // Get value
        var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
        if (valueProviderResult != null)
        {
            var theValue = valueProviderResult.AttemptedValue;

            // etc...
        }
    }
}

অন্যান্য প্রয়োজনীয় অংশটি একটি অবৈধ মান পুনরুদ্ধার করার একটি উপায়। এই উদাহরণে আমরা মডেলবাইন্ডিং কনটেক্সট শ্রেণীর জন্য একটি এক্সটেনশন পদ্ধতি ব্যবহার করি:

public static class ExtensionHelpers
{
    public static ValueProviderResult GetValueFromValueProvider(this ModelBindingContext bindingContext, bool performRequestValidation)
    {
        var unvalidatedValueProvider = bindingContext.ValueProvider as IUnvalidatedValueProvider;
        return (unvalidatedValueProvider != null)
          ? unvalidatedValueProvider.GetValue(bindingContext.ModelName, !performRequestValidation)
          : bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    }
}

এই সম্পর্কে আরও তথ্য http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-uthorization/ এ


আমার কাছে এটি কন্ট্রোলারে রয়েছে [এইচটিটিপিপোস্ট, ভ্যালিডেটইনপুট (মিথ্যা)] এবং আমি এখনও ত্রুটি পেয়েছি
ডিডাব্লু

একটি কাস্টম মডেলবাইন্ডার ব্যবহার করার সময় আমার সংশোধিত উত্তরটি এর চারপাশে দেখুন
ericdc

ধন্যবাদ, তবে এটি এই লাইনটিকে বাধ্যতামূলকভাবে পছন্দ করে না কনটেক্সট.গেটভ্যালুফর্মভ্যালুপ্রোভিডার
ডিডাব্লু

GetValueFromValueProvider এর সর্বজনীন স্ট্যাটিক শ্রেণিতে থাকা দরকার। উপরের সম্পাদনাগুলি দেখুন।
এরিকডিসি

সুতরাং, মানপ্রভাইডার ফলাফল নূতন পুনরুত্থান? var valuePoviderResult = বাইন্ডিংকন্টেক্সট.গেটভ্যালুফ্রমভালিউপ্রভাইডার (shouldPerforRequestValidation);
ডিডাব্লু

31

চেষ্টা করুন:

HttpRequestBase request = controllerContext.HttpContext.Request;
string re = request.Unvalidated.Form.Get("ConfirmationMessage")

আমি যখন এটি চেষ্টা করি তখন আমি একটি ব্যতিক্রম পাই যা বলছে: নন-ইনভয়েবল সদস্য 'System.web.HttpRequestBase.Unuthorated' কোনও পদ্ধতির মতো ব্যবহার করা যাবে না। এই জিনিস পরিবর্তন হয়েছে?
স্ট্যাক0 ফ্লাওয়ার

7
দ্বিতীয় লাইনটি সত্যই হওয়া উচিতvar re = request.Unvalidated.Form["ConfirmationMessage"];
Stack0verflow

5

ফর্ম মান উপর iterating, আমার সম্পাদনা নিয়ামক মধ্যে @DW থেকে উত্তর উপর সম্প্রসারণ করা হচ্ছে, আমি সমস্ত উদাহরণ প্রতিস্থাপন ছিল Request.Params.AllKeysসঙ্গে Request.Unvalidated.Form.AllKeysএবং সমস্ত উদাহরণ Request[key]দিয়ে Request.Unvalidated.Form[key]

এটি আমার জন্য কাজ করা একমাত্র সমাধান ছিল।


0

মাইক গডিন যেমন লিখেছেন, এমনকি আপনি যদি [ValidateInput (মিথ্যা)] বৈশিষ্ট্যটি সেট করে থাকেন তবে আপনাকে অনুরোধ.অনুযুক্ত.ফর্মের পরিবর্তে অনুরোধটি ব্যবহার করতে হবে orm ফর্ম এটিএসপি.নেট এমভিসি 5 এর সাথে আমার পক্ষে কাজ করেছে orm


4
এটি একটি কার্যকর পরামর্শ ছিল, যেমন বেস কন্ট্রোলার থেকে ডেটা অ্যাক্সেস হিসাবে (যেমন লগ বা ডিবাগের উদ্দেশ্যে) অনুরোধের যে কোনও অ্যাক্সেস। ফর্মটি ব্যতিক্রম ছুঁড়ে ফেলে এমনকি মডেলটির এই বৈশিষ্ট্যটি থাকলেও।
nsimeonov

-4

ক্লায়েন্ট স্তরে এনকোড এবং সার্ভার স্তরে এটি ডিকোড করার পদক্ষেপগুলি এখানে রয়েছে:

  1. Jquery জমা পদ্ধতি ব্যবহার করে ফর্ম পোস্ট করুন।

  2. জিকুরি বোতামে ক্লিক ইভেন্ট ইভেন্ট এনকোড ক্ষেত্র যা আপনি সার্ভারে পোস্ট করতে চান। উদাহরণ:

    $("#field").val(encodeURIComponent($("#field").val()))
    $("#formid").submit();
    
  3. নিয়ামক স্তরে ব্যবহার করে সমস্ত ফর্ম আইডি মান অ্যাক্সেস করুন

    HttpUtility.UrlDecode(Request["fieldid"])
    

উদাহরণ উদাহরণ:

  • নিয়ামক স্তর:

    public ActionResult Name(string id)
    {
    
        CheckDispose();
        string start = Request["start-date"];
        string end = Request["end-date"];
        return View("Index", GetACPViewModel(HttpUtility.UrlDecode(Request["searchid"]), start, end));
    }
    
  • ক্লায়েন্ট স্তর:

    <% using (Html.BeginForm("Name", "App", FormMethod.Post, new { id = "search-form" }))
    { %>
    <div>
    <label  for="search-text" style="vertical-align: middle" id="search-label" title="Search for an application by name, the name for who a request was made, or a BEMSID">App, (For Who) Name, or BEMSID: </label>
    <%= Html.TextBox("searchid", null, new {value=searchText, id = "search-text", placeholder = "Enter Application, Name, or BEMSID" })%>
    </div>
    <div>
    <input id="start-date" name="start-date" class="datepicker" type="text"  placeholder="Ex: 1/1/2012"/>
    </div>
    <div>
    <input id="end-date" name="end-date" class="datepicker" type="text"  placeholder="Ex: 12/31/2012"/>
    </div>
    <div>
    <input type="button" name="search" id="btnsearch" value="Search" class="searchbtn" style="height:35px"/>
    </div> 
    <% } %>
    

ডকুমেন্ট রেডি ফাংশনে:

$(function () {     
  $("#btnsearch").click(function () {  
    $("#search-text").val(encodeURIComponent($("#search-text").val()));
    $("#search-form").submit();
  });
});

4
জ্যাকোয়ারি এবং ক্লায়েন্ট-সাইড প্রযুক্তির এমভিসির সাথে কোনও সম্পর্ক নেই, বৈধতা এমভিসি ফ্রেমওয়ার্কের সাথে সার্ভারের পাশে ঘটে। এটি কোনও বৈধ উত্তর নয়
ডায়াগোসাস্ব 21

4
মাইক্রোসফ্ট আক্ষরিকভাবে AllowHtml বৈশিষ্ট্যটিকে উপেক্ষা করে এবং প্রদত্ত যে একমাত্র কার্যক্ষম সমাধান সার্ভার-সাইডটি হ'ল ডিফল্ট মডেল বাইন্ডারের কার্যকারিতা প্রতিস্থাপন করা, আমি যুক্তি দেব যে ক্লায়েন্ট-সাইড এনকোডিং একটি পুরোপুরি বৈধ বিকল্প।
জোনাথন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.