Soru ASP.NET MVC Potansiyel olarak tehlikeli Request.Form değeri, özel bir model binder kullanırken istemciden tespit edildi.


Hatayı burada almak:

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

Sadece bir değer seçimine nasıl izin veririm? diğer bir deyişle

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

76
2018-06-22 19:08


Menşei


Olası kopya Potansiyel olarak tehlikeli Request.Form değeri müşteriden tespit edildiWebforms veya MVC olup olmadığı önemli değil. - Erik Philips
Teşekkürler, ama meseleye farklı olarak bakmadınız - D-W
Tam olarak aynı kök sorunu, tek fark, bununla başa çıkmak için MVC özel yolları olabilir. - Erik Philips


Cevaplar:


Birkaç seçeneğin var.

Modelde, HTML'ye izin vermeniz gereken her özelliğe bu özelliği ekleyin - En iyi seçim

using System.Web.Mvc;

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

Denetleyici eyleminde, tüm HTML özelliklerine izin vermek için bu özelliği ekleyin

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

Web.config'ta kaba kuvvet - kesinlikle tavsiye edilmez

Web.config dosyasında, etiketler içinde httpRuntime öğesini attribfic requestValidationMode = "2.0" ile ekleyin. Ayrıca, sayfalar öğesinde validateRequest = "false" özelliğini de ekleyin.

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

Daha fazla bilgi: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx

Yukarıdaki varsayılan modelleyici kullanımı için çalışır.

Özel ModelBinder

Yukarıdaki kodda bindingContext.ValueProvider.GetValue () öğesine yapılan bir çağrının, herhangi bir öznitelikten bağımsız olarak verileri her zaman doğruladığı görülmektedir. ASP.NET MVC kaynakları içine kazma, DefaultModelBinder'ın öncelikle doğrulama isteğinin gerekli olup olmadığını denetlediğini ve doğrulama işleminin gerekli olup olmadığını belirten bir parametreyle bindingContext.UnvalidatedValueProvider.GetValue () yöntemini çağırdığını ortaya çıkarır.

Maalesef, çerçeve kodunun hiçbirini, gizli, gizli veya cahil devleri tehlikeli şeyler yapmaktan koruyan her şey için kullanamıyoruz, ancak AllowHtml ve ValidateInput özelliklerine saygı gösteren çalışan bir özel model ciltleyici oluşturmak çok zor değil:

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...
        }
    }
}

Diğer gerekli parça, onaylanmamış bir değeri geri almanın bir yoludur. Bu örnekte ModelBindingContext sınıfı için bir uzantı yöntemi kullanıyoruz:

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

Bu konuda daha fazla bilgi http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/


188
2018-06-23 06:03



Denetleyicide [HttpPost, ValidateInput (false)] var ve hala hatayı alıyorum - D-W
Özel model oluşturucuyu kullanırken, gözden geçirilmiş cevabımı bu şekilde bir şekilde görün - ericdc
Teşekkürler, ancak bu satırın bindingContext.GetValueFromValueProvider gibi değil - D-W
GetValueFromValueProvider'ın genel statik bir sınıfta olması gerekir. Yukarıdaki düzenlemelere göz atın. - ericdc
Ta, valueProviderResult reutrns null tho? var valueProviderResult = bindingContext.GetValueFromValueProvider (shouldPerformRequestValidation); - D-W


Deneyin:

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

27
2018-06-24 20:00



Bunu denediğimde, bir istisna alıyorum diyor ki: Non-invocable üye 'System.web.HttpRequestBase.Unvalidated' bir yöntem gibi kullanılamaz. Bu şey değişti mi? - Stack0verflow
İkinci satır gerçekten olmalı var re = request.Unvalidated.Form["ConfirmationMessage"]; - Stack0verflow


@ D-W yanıtını genişleterek, Düzenleyici denetleyicimde form değerleri üzerinde yineleme yaparken, tüm örneklerini değiştirmem gerekiyordu. Request.Params.AllKeys ile Request.Unvalidated.Form.AllKeys ve tüm örnekleri Request[key] ile Request.Unvalidated.Form[key].

Bu benim için çalışan tek çözüm oldu.


0
2018-02-28 17:12





İstemci düzeyinde kodlama ve sunucu düzeyinde kod çözme adımları şunlardır:

  1. Formu jquery submit yöntemini kullanarak gönderin.

  2. JQuery butonunda, sunucuya göndermek istediğiniz alanı kodlamak için tıklayın. Örnek:

    $("#field").val(encodeURIComponent($("#field").val()))
    $("#formid").submit();
    
  3. Kontrolör Seviyesinde, tüm form kimliği değerlerini kullanarak

    HttpUtility.UrlDecode(Request["fieldid"])
    

Örnek örnek:

  • Denetleyici seviyesi:

    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));
    }
    
  • Müşteri seviyesi:

    <% 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> 
    <% } %>
    

Belge Hazır işlevinde:

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

-3
2017-07-01 09:14



JQuery ve client-side teknolojisinin MVC ile hiçbir ilgisi yoktur, doğrulama MVC framework ile sunucu tarafında gerçekleşir. Geçerli bir cevap değil - iberodev
Microsoft, AllowHtml özniteliğini tam anlamıyla yok sayar ve varsayılan çözümleyicinin işlevselliğini değiştirebilecek tek çözüm sunucusu tarafı olduğu göz önüne alındığında, istemci tarafı kodlamanın mükemmel bir seçenek olduğunu iddia ediyorum. - Jonathan