2011-01-27 59 views
11

我有一个基于MVC3(无测试版或发布候选版本,RTM/RTW版本)的Web应用程序,它具有接受要处理的XML文件的操作。MVC3 AllowHtml属性问题

当然,由于可能的攻击,这对于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不应该是必需的。然而它有一点点不同。

如果我添加这对我的web配置:

<httpRuntime requestValidationMode="2.0" /> 

它适用于从本地计算机发起的请求,但它不会从其他系统工作。

我认为AllowHtml版本看起来很优雅 - 只要它有效。

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

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); 

正如预期的那样,它没有真正的区别。

在我的开发计算机(Win7x64,VS2010)上一切正常,但在目标系统上(Win2008R2x64,IIS7.5),上述问题给我一个很难的时间。

很重要的一点要注意:如果我发布到没有尖括号的动作,我得到预期的表单数据。但是,只要尖括号出现,我的动作根本不会被调用,或者它找不到表单数据,无论是在操作方法参数中还是在例如Request.Params [“msg”]中应该。

任何允许XML通过的想法?

UPDATE

我试图解决这个我的方式在等待任何人都可以想出一个答案在这里。我还没有能够解决它,但我已经检查了一些额外的细节;

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

不用说,这是推动我疯了。我昨天有一些建议,看看MVC3的源代码,但不幸的是,这并没有真正帮助我,因为我看不出有什么明显的错误,并且我无法在有问题的服务器上调试代码。

任何见解仍然非常期望,谢谢! :)

回答

3

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

将数据发布到我的应用程序中的系统对格式不正确的数据执行此操作。除此之外,我被告知他们还在发布一个运行良好的MVC2应用程序 - 这是错误的,事实证明他们在这种情况下GET,并且GET正好做到了。

如果有什么,相当彻底的测试已经证实AllowHtml属性实际上工作得很好。永远不要相信你的输入。 :)

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]时,它会生成相应的错误消息。

+0

谢谢布拉德,非常感谢!我自己已经取得了一些进展,并且希望今天能够确定一些解决方案。 – 2011-02-01 13:11:37