每当用户在我的Web应用程序中发布包含<或>在页面中的内容时,我都会抛出此异常.
我不想进入关于抛出异常或崩溃整个Web应用程序的聪明性的讨论,因为有人在文本框中输入了一个字符,但我正在寻找一种优雅的方法来处理这个问题.
捕获异常并显示
发生错误请返回并重新输入整个表单,但这次请不要使用<
对我来说似乎不够专业.
禁用post validation(validateRequest="false")肯定会避免此错误,但它会使页面容易受到许多攻击.
理想情况:当发回包含HTML限制字符的回发时,Form集合中的已发布值将自动进行HTML编码.所以.Text我的文本框的属性将是something & lt; html & gt;
有没有办法可以从处理程序中执行此操作?
仅供参考我使用的是.NET 4.0/MVC 3.
在我的控制器中,以下是我的代码:
[HttpPost]
[ValidateInput(false)]
public ViewResult Edit(ContentTemplateView contentTemplateView, FormCollection collection)
Run Code Online (Sandbox Code Playgroud)
当我不输入HTML时,一切正常,所以我知道正在触发正确的控制器.另外,我在web.config文件中正确设置了以下内容:
<httpRuntime requestValidationMode="2.0"/>
Run Code Online (Sandbox Code Playgroud)
当我包含FormCollection(这个特定的控制器需要)时,我才会遇到这个问题.那我究竟做错了什么?
[我已经完成了以下问题的建议,只要没有FormCollection,它们就可以工作.他们都没有提供包含FormCollection的解决方案]
我试图绕过"潜在危险的Request.Form值"错误,我没有运气.是的,是的,我已经阅读了所有其他与StackOverflow相关的问题,但似乎没有一个问题让我更接近答案.我正在使用[ValidateInput(false)]所有相关的控制器动作......我已经多次检查过了.我正在使用ValidateRequest='false'所有相关的ASPX视图.
我正在使用ASP.NET MVC 2 Preview 1,但我不认为这是一个问题,因为错误在框架中生成较低; Page.ProcessRequest确切.我看不到任何我做错的事情,我甚至设置<page validateRequest='false'>在web.config中并且也没有解决它.
使用WIF时,我也收到了请求验证错误.我被正确地发送到STS,但在回来的路上,我得到了这个验证错误.
我遵循了所有指示.
<httpRuntime requestValidationMode="2.0" />
Run Code Online (Sandbox Code Playgroud)
校验!
[ValidateInput(false)]
Run Code Online (Sandbox Code Playgroud)
校验!
<pages validateRequest="false" >
Run Code Online (Sandbox Code Playgroud)
校验!
我尝试了一个自定义验证器,但它永远不会被实例化.
错误堆栈:
[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (wresult="trust:RequestSecuri...").]
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +11396740
System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +82
System.Web.HttpRequest.get_Form() +212
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.IsSignInResponse(HttpRequest request) +26
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request, Boolean onPage) +145
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +108
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我试图通过执行以下操作关闭控制器中所有操作方法的请求验证:
[ValidateInput(false)]
public class MyController : Controller
{
...
Run Code Online (Sandbox Code Playgroud)
我正在使用的参考说这是可能的,并告诉我这样做,但由于某种原因,它不起作用.
如果我通过文本框提交任何html(甚至是简单的<b>标签),我会收到错误消息:
从客户端检测到一个潜在危险的Request.Form值(text = <b>").
通过将属性附加到单个方法也无法正常工作.
如何禁用控制器的请求验证?
我在VS2008内置测试服务器.
我有一个MVC3应用程序,它有一个自定义HandleErrorAttribute,以便我可以通过电子邮件发送错误.我经常得到"从客户端检测到一个有潜在危险的Request.Form值",但它只显示导致异常的表单值的前几个字符.我希望看到输入的整个表单值,以便在输入是恶意的或用户意外时更好地了解.但是,当我尝试在HandleErrorAttribute中提取表单值时,它会抛出相同的错误!任何想法如何从Request.Form获取表单值而不导致我的异常处理程序中的验证?
public class HandleErrorLogAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
base.OnException(context);
//Record Error
string errorDetails = HttpUtility.HtmlEncode(context.Exception.ToString());
// Throws "otentially dangerous..." error here
foreach (var key in context.RequestContext.HttpContext.Request.Form.AllKeys)
{
errorDetails += key + "=" + HttpUtility.HtmlEncode(context.RequestContext.HttpContext.Request.Form[key]);
}
// Send Email with errorDetails
}
}
Run Code Online (Sandbox Code Playgroud)