MVC3 AllowHtml属性的问题

时间:2011-01-27 20:07:50

标签: asp.net-mvc-3

我有一个基于MVC3的网络应用程序(没有测试版或候选版本,RTM / RTW版本),它有一个接受XML文件进行处理的动作。

当然,由于可能的攻击,这对MVC来说似乎是邪恶的,所以它不允许它。好吧,我尝试将AllowHtml放在模型对象上:

   public class XMLModel
    {
        [AllowHtml]
        public string msg { get; set; }
    }

或者我在我的操作方法上将ValidateInput设置为false,如下所示:

    [ValidateInput(false)]
    public ActionResult AddCDR(XMLModel model)
    {
    }

首先使用“强”类型模型的原因是我最初尝试将名为“msg”的字符串值作为操作方法参数,但它总是返回空白。

现在,当有人在同一台计算机或联网计算机上发布此表单时,msg字段始终为空。

我已经使用WireShark验证了数据实际上在请求中。

现在,一件有趣的事情。 对于MVC 3 ,这不是必需的。但它略有不同。

如果我将其添加到我的网络配置中:

<httpRuntime requestValidationMode="2.0" />

它适用于源自本地计算机的请求,但它不适用于其他系统。

我认为AllowHtml版本似乎很优雅 - 只要它有效。

我也发现了RC2中的一个错误 - 再次,这不应该影响我,但我还是尝试在Application_Start()中添加以下内容:

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();

正如所料,它没有什么不同。

在我的开发计算机(Win7x64,VS2010)上,一切都按预期工作,但在目标系统(Win2008R2x64,IIS7.5)上,上述问题让我很难过。

非常重要的注意事项:如果我发布到没有尖括号的操作,我会按预期获得表单数据。但是,只要尖括号出现,我的动作就完全没有被调用,或者它没有找到表单数据,也没有在动作方法参数中或在例如Request.Params [“msg”]中找到它应该是。

允许XML通过的任何想法?

更新

我试图在这里等待有人在这里找到答案。我还没有解决它,但我已经检查了一些额外的细节;

  • 首先,我验证了我的开发计算机和Web服务器上安装的ASP.NET MVC 3版本是相同的; v3.0.20105.0(根据添加/删除程序)。
  • Web应用程序实际上是使用MVC3 beta创建的,然后在它们出现时转换为RC1和RC2,最后转换为RTM版本。这意味着我必须修改一些代码,因为ViewBag更改。但是,由于我不确切知道还有什么改变,我用RTM版本创建了一个全新的MVC3应用程序,用相同的名称创建了一个控制器,使用相同的动作方法,获取了与当前使用的类似的模型对象,重命名旧的Web应用程序目录并将新的目录放在适当的位置。完全相同的事情发生 - 即当从本地机器发出请求时,具有AllowHtml属性的参数会通过所有内容,但如果它来自远程机器,则HTML(实际上是XML)被剥离。
    • 没有例外。我已经安装了Elmah并验证了这一点 - 没有异常发生,我的动作方法显然只是调用了从参数到方法的XML被剥离的任何东西。

毋庸置疑,这让我发疯了。昨天我有一些建议来查看MVC3的源代码,但不幸的是,这对我没有帮助,因为我看不到任何明显的错误,我无法在有问题的服务器上调试代码。

任何见解仍然非常需要,谢谢! :)

2 个答案:

答案 0 :(得分:7)

我无法重现这一点。

型号:

using System.Web.Mvc;

namespace MvcApplication3.Models {
    public class XmlModel {
        [AllowHtml]
        public string msg { get; set; }
    }
}

控制器:

using System.Web.Mvc;
using MvcApplication3.Models;

namespace MvcApplication3.Controllers {
    public class HomeController : Controller {
        public ActionResult Index() {
            return View();
        }

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

查看:

@model MvcApplication3.Models.XmlModel

@using (Html.BeginForm()) {
    <div class="editor-label">
        @Html.LabelFor(model => model.msg)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.msg)
        @Html.ValidationMessageFor(model => model.msg)
    </div>
}

这些已添加到默认的空MVC 3项目中。一切都很好。当我删除[AllowHtml]时,它会生成相应的错误消息。

答案 1 :(得分:3)

我自己回答这个问题,因为这是一个模糊的情况,MVC3不是问题所在。

将数据发布到我的应用程序的系统正在使用格式错误的数据。除此之外,有人告诉我,他们也发布了一个工作得很好的旧版MVC2应用程序 - 这是错误的,事实证明他们在这种情况下是GETting,而且他们碰巧正确地做了。

如果有的话,相当彻底的测试已经确认AllowHtml属性实际上非常有效。永远不要相信你的意见。 :)