这是ASP.Net MVC 5
项目
我有一个简单的模型,其中一个属性允许HTML
输入:
public class FooModel {
//other properties
[AllowHtml]
public string BarField { get; set; }
}
使用该模型的控制器如下所示:
[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
public class FooController : Controller {
//some other codes...
// GET: Foo/Create
public ActionResult Create(int? id, int number = 0) {
//some code
}
// POST: Foo/Create
[HttpPost]
public ActionResult Create(FooModel fooModel) {
//some code
}
// GET: Foo/Edit/5
public ActionResult Edit(int? id, int number = 0) {
//some code
}
// POST: Foo/Edit/5
[HttpPost]
public ActionResult Edit(FooModel model, FormCollection collection) {
//some code
}
}
阅读SO中的一些帖子:
我知道必须执行以下操作才能确保AllowHtml
属性起作用:
<httpRuntime requestValidationMode="2.0" />
[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
因此,我在web.config中有<system.web>
的完整元素:
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.6" />
<httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
<httpModules>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
</system.web>
而且,正如您所看到的,我还将OutputCache
属性放在控制器之上:
[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
现在,这对Create
Action非常有效(也就是说,我可以在BarField
中插入HTML元素,并且接受帖子并且可以毫无问题地调用Action)。
但是当我执行Edit
动作时,甚至没有调用动作并且错误:
从客户端检测到一个潜在危险的Request.Form值(BarField =&#34; ...这里的字词&lt; i&gt;以及此处&lt; / i&gt;&lt; ...&#34;)。< / p>
描述:ASP.NET检测到请求中存在潜在危险的数据,因为它可能包含HTML标记或脚本。数据可能表示试图破坏应用程序的安全性,例如跨站点脚本攻击。如果此类输入适用于您的应用程序,则可以在网页中包含代码以明确允许它。有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkID=212874。
显示在页面上。为什么会这样?
答案 0 :(得分:1)
抛出异常是因为您在FormCollection collection
方法中包含了其他参数Edit()
。
当您应用[AllowHtml]
属性时,它会将属性RequestValidationEnabled
的{{1}}属性设置为ModelMetadata
。在模型绑定过程中,false
检查此值,因为它的DefaultModelBinder
,绑定到模型时不会抛出异常。
但是,false
只是FormCollection
,并且通过阅读NameValueCollection
值进行填充。没有模型和关联的元数据,因此抛出异常。如果您使用
Request.Form
虽然使用var barField= Request["BarField"];
的{{1}}属性可以正常工作
Unvalidated
您也可以通过将Request
属性应用于该方法来使其工作,但这将适用于整个模型,并且是禁用请求验证的最不安全的方法。
删除var barField = Request.Unvalidated.Form["BarField"];
方法中的[ValidateInput(false)]
参数将解决问题,在任何情况下,都没有理由在MVC中使用FormCollection collection
(您应该始终绑定到模特)。