17 October 2010 ASP.NET 4, HowTo, MVC, RequestValidation Robert Muehsig

image

Das ASP.NET Framework validiert einkommende Requests ob diese <html> Elemente enthalten oder nicht. Dies soll Script-Injection vorbeugen. Ab und an braucht will man aber dieses verhalten nicht. Bis zu .NET 3.5 Zeiten brauchte man über ASP.NET MVC Actions einfach nur das Attribut "ValidateInput(false)” setzen. Unter ASP.NET 4 muss man noch eine Kleinigkeit beachten

Szenario:

Simples Input Feld:

        <% using(Html.BeginForm()) { %>
            <%:Html.TextBox("HtmlInput", ViewData["HtmlInput"]) %>                                  
        <%}%>

image

Nix besonderes im Controller, außer dass die Post - Index Methode mit ValidateInput (false) dekoriert wurde:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcRequestValidation.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        [ValidateInput(false)]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(string htmlInput)
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";
            ViewData["HtmlInput"] = htmlInput;
            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

Das ganze läuft unter .NET 4.0.

Und nun? Trotzdem Fehlermeldung...

image

Lösung des Problems: (Steht sogar in der Description)

To allow pages to override application request validation settings, set the requestValidationMode attribute in the httpRuntime configuration section to requestValidationMode="2.0". Example: <httpRuntime requestValidationMode="2.0" />. 

Wer liest schon Fehlermeldungen? ;) Zum Glück war ich nicht der einzige mit dem Problem ;)

Ist auch als Breaking Change in den Dokumentationen von Microsoft zu finden. Unter <system.web> noch "<httpRuntime requestValidationMode="2.0" />” einfügen und fertig :)

image

[Download Democode]


Written by Robert Muehsig

Software Developer - from Saxony, Germany - working on primedocs.io. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de