每当用户在我的Web应用程序中发布包含<或>在页面中的内容时,我都会抛出此异常.
我不想进入关于抛出异常或崩溃整个Web应用程序的聪明性的讨论,因为有人在文本框中输入了一个字符,但我正在寻找一种优雅的方法来处理这个问题.
捕获异常并显示
发生错误请返回并重新输入整个表单,但这次请不要使用<
对我来说似乎不够专业.
禁用post validation(validateRequest="false")肯定会避免此错误,但它会使页面容易受到许多攻击.
理想情况:当发回包含HTML限制字符的回发时,Form集合中的已发布值将自动进行HTML编码.所以.Text我的文本框的属性将是something & lt; html & gt;
有没有办法可以从处理程序中执行此操作?
requestValidationMode ="4.5"和requestValidationMode ="2.0"之间有区别吗?我有一个.net 4.5应用程序,有一个我不想验证的控件,因为用户可以输入html标签:
<asp:TextBox ID="txtTitle" runat="server" ValidateRequestMode="Disabled" />
Run Code Online (Sandbox Code Playgroud)
在我的web.config我有:
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5">...</compilation>
<httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
Run Code Online (Sandbox Code Playgroud)
最初我已经把requestValidationMode ="4.5",但是这不起作用,我仍然会得到关于标签的错误 - "从客户端检测到一个有潜在危险的Request.Form值...",一旦提交表单.但是,如果我将它设置为requestValidationMode ="2.0"它可以工作,我可以点击PageLoad并对该字段中的值进行编码.
我有一个基于MVC3的Web应用程序(没有beta或候选版本,RTM/RTW版本),它有一个接受XML文件进行处理的动作.
当然,由于可能的攻击,这对MVC来说似乎是邪恶的,所以它不允许它.好吧,我尝试将AllowHtml放在模型对象上:
public class XMLModel
{
[AllowHtml]
public string msg { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
或者我在我的操作方法上将ValidateInput设置为false,例如:
[ValidateInput(false)]
public ActionResult AddCDR(XMLModel model)
{
}
Run Code Online (Sandbox Code Playgroud)
首先使用"强"类型模型的原因是我最初尝试将名为"msg"的字符串值作为操作方法参数,但总是返回空.
现在,当有人在同一台计算机或联网计算机上发布此表单时,msg字段始终为空白.
我已经使用WireShark验证了数据实际上在请求中.
现在,一件有趣的事情.对于MVC 3,这不是必需的.但它略有不同.
如果我将其添加到我的网络配置:
<httpRuntime requestValidationMode="2.0" />
Run Code Online (Sandbox Code Playgroud)
它适用于来自本地计算机的请求,但它不适用于其他系统.
我认为AllowHtml版本似乎很优雅 - 只要它有效.
我也发现了RC2中的一个错误 - 再次,这不应该影响我,但我还是尝试在Application_Start()中添加以下内容:
ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它没有什么不同.
一切都在我的开发计算机(Win7x64,VS2010)上按预期工作,但在目标系统(Win2008R2x64,IIS7.5)上,上述问题让我很难过.
非常重要的一点要注意:如果我发布没有尖括号的动作,我会得到预期的表单数据.但是,只要尖括号出现,我的动作就完全没有被调用,或者它没有找到表单数据,也没有在动作方法参数中或在例如Request.Params ["msg"]中找到它应该.
任何允许XML通过的想法?
UPDATE
在等待有人在这里提出答案时,我试图绕过这个.我还没有解决它,但我已经检查了一些额外的细节;
不用说,这让我发疯了.昨天我有一些建议来查看MVC3的源代码,但不幸的是,这并没有真正帮助我,因为我看不到任何明显的错误,我无法在有问题的服务器上调试代码.
任何见解仍然非常需要,谢谢!:)
我在MVC3应用程序中看到了一个奇怪的行为.我有一个由Ajax调用的Action,并收到一个带有HTML文本的帖子.我想允许输入HTML,所以我设置了ValidateInput(false)属性.我还有一个带有以下参数的全局OutputCache过滤器:(NoStore = true,Duration = 0,VaryByParam ="*")
代码如下所示:
[HttpPost]
[ValidateInput(false)]
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*" )]
public ActionResult Edit(SomeModel someModel)
{
saveModel(someModel);
return new AjaxEditSuccessResult();
}
Run Code Online (Sandbox Code Playgroud)
当我向该方法发送帖子时,它会被执行并保存模型,但我得到的响应是标准的"从客户端检测到一个潜在危险的Request.Form值"错误消息,带有此栈跟踪:
[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (text="<p class="MsoNormal"...").]
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +9665149
System.Web.<>c__DisplayClass5.<ValidateHttpValueCollection>b__3(String key, String value) +18
System.Web.HttpValueCollection.EnsureKeyValidated(String key) +9664565
System.Web.HttpValueCollection.Get(String name) +17
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(String path, HttpVerb verb, HttpContext context, CachedVary cachedVary) +676
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(HttpContext context, CachedVary cachedVary) +55
System.Web.Caching.OutputCacheModule.OnLeave(Object source, EventArgs eventArgs) …Run Code Online (Sandbox Code Playgroud)