AllowHtml不适用于ASP.Net Mvc 3站点

时间:2012-01-10 20:28:53

标签: asp.net-mvc html-encode

我们正试图在我们的ViewModel属性上使用[AllowHtml]装饰,以便我们可以避免使用YSOD:

  

从中检测到一个潜在危险的Request.Form值   客户端(RequestText = "<br>")。

当我们尝试提交html文字时,例如:<br>。我们希望在控制器操作中使用Server.HtmlEncode来防止攻击,但是当我们使用[AllowHtml]装饰属性时它没有任何影响,如果我们尝试在控制器操作上使用[ValidateInput(false)],它也没有效果。我们看到StackOverflow Post说在MVC 3 RC2中你必须添加:

  

ModelMetadataProviders.Current = new   DataAnnotationsModelMetadataProvider();到global.asax

我们也尝试过,即使我们使用的是MVC 3的发布版本,而不是RC2,但这也没有效果。有谁知道如何解决这个问题?

型号:

namespace UI.Models.ViewModel
{
    public class CustomerRequestSupport
    {
        /// <summary>
        /// Gets or Sets the textual description entered by the Customer for 
        /// the support requested.
        /// </summary>
        [AllowHtml]
        public string RequestText { get; set; }
    }
}

控制器:

    [HttpPost]
    [TabsActionFilter]
    public ActionResult RequestSupport(CustomerRequestSupport collection)
    {
        if (ModelState.IsValid)
        {

            Ticket ticket = new Ticket();

            ticket.Requestor = LoggedInCustomer;

            ticket.Summary = "General Support Ticket";
            ticket.Notes = Server.HtmlEncode(collection.RequestText);

            var errors = _ticketService.SubmitTicket(ticket);

            if (errors.Any())
            {
                ModelState.AddModelError("collection",
                    String.Format("An error has occurred in your Request for Support: " +
                    "{0} Please try again later or call the help desk " +
                    "for immediate assistance.",
                    errors.Aggregate((acc, st) => acc + " " + st)));
            }
            else
            {
                TempData["FlashMessage"] = String.Format("Your request for support has been " +
                        "submitted, the Ticket Number is: {0}.", ticket.TicketNumber);

                return AutoMapView<CustomerDetails>(View("Details", base.LoggedInCustomer));
            }
        }

        //needed for tabs to show
        ViewData.CustomerContactSet(base.LoggedInCustomer);

        return View();

查看:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"     Inherits="System.Web.Mvc.ViewPage<UI.Models.ViewModel.CustomerRequestSupport>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Request Support
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="PageTitle" runat="server">
 Request Support
</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm())
   { %>
    <%= Html.ValidationSummary() %>
    <h2>Enter a description of the support needed</h2>
    <%: Html.TextAreaFor( m => m.RequestText, 4, 90, null) %>
    <input type="submit" value="Submit" />
<% } %>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="JavaScriptContent" runat="server">
</asp:Content>

2 个答案:

答案 0 :(得分:7)

你必须做错事。不幸的是,由于你没有展示你的例子,我们无法知道你做错了什么。让我给你写一个完整的例子:

型号:

public class MyViewModel
{
    [AllowHtml]
    public string RequestText { get; set; }
}

控制器:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            RequestText = "<strong>Hello World</strong>";
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

查看:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.TextAreaFor(x => x.RequestText)
    <button type="submit">OK</button>
}

所以你要做的不同于我在这里展示的东西。它是什么?

答案 1 :(得分:2)

在他的answer Darin肯定是在向他提出要求时。

  

所以你要做的不同于我在这里展示的东西。   它是什么?

我猜您在考虑FormCollection之前,还有其他影响正在访问[AllowHtml]的ASP.NET管道的内容。在我的脑海中,触及管道的一些常见ASP.NET MVC OSS库是ELMAHGlimpseWebActivatorMvcContrib,还有更多但是你得到的这个想法。

我必须相信您正在使用上述工具之一或类似的东西。假设您确保使用每个版本的最新版本并检查其开放的错误报告。

最后,快速确定您的代码,MVC实例或OSS库是否可以创建测试项目。尝试创建一个vanilla ASP.NET MVC项目。确保AllowHtml有效。然后添加各种OSS组件,直到它中断。只需确保在OSS组件中添加版本与当前项目中使用的版本匹配的版本。