如何在asp.net中优雅地处理此错误?

时间:2010-03-03 20:53:45

标签: asp.net error-handling xss

我有一个asp.net网站....我想知道如何在用户输入和提交非法字符(xss攻击)时优雅地处理此错误。

“从客户端检测到一个潜在危险的Request.Form值(ctl00 $ TextBox1 =”“).........等”

我可以关闭requestvalidation属性并编写一个代码来过滤带有非法字符的字符串,但我认为将其关闭并不是一个好习惯。我宁愿把它留在上面,并优雅地捕获错误说将用户重定向到另一个告诉他/她错误的页面。你会怎么做?

4 个答案:

答案 0 :(得分:2)

我在一个项目中遇到了同样的问题,我们希望继续使用验证请求选项作为第一道防线。问题是在Web表单中,表单值在流程请求的初始阶段进行验证。

我们最终解决这个问题的方式如下:

  1. 禁用项目的请求验证
  2. 创建一个继承自base validator
  3. 的自定义验证程序
  4. 在所有页面(或母版页)上使用自定义验证器
  5. 我们的自定义验证器与下面的类似:

    public class UserInputValidator : BaseValidator
    {
    
        private HttpRequest Request
        {
            get { return HttpContext.Current.Request; }
        }
    
    
        protected override bool ControlPropertiesValid()
        {
            //Override the base functionality because this will check for a control to validate, what we won't do. 
            return true;
        }
    
        protected override bool EvaluateIsValid()
        {
            bool isValid = true;
            var message = new StringWriter();
            if (Request != null)
            {
                //Validate input will enable request validation. 
                Request.ValidateInput();
                NameValueCollection formValues = Request.Form;
                foreach (string formKey in formValues.Keys)
                {
                    try
                    {
    #pragma warning disable 168
                        //Access the form variable to trigger request validation.
                        string formValue = formValues[formKey];
    #pragma warning restore 168
                    }
                    catch (HttpRequestValidationException)
                    {
                        string orgValue = Request.Unvalidated.Form[formKey];
    
    
    
                        message.WriteLine("The following input is not allowed: {0}", HttpUtility.HtmlEncode(orgValue));
                        isValid = false;
                    }
                }
            }
            ErrorMessage = message.ToString();
            return isValid;
        }
    }
    

    这是有效的,因为禁用请求验证时,不会调用ValidateInput。通过在验证页面时调用此方法,我们强制为请求激活请求验证。

    接下来我们要做的是从表单集合中访问每个值(至少在asp.net 4.5中),以便在适当时触发异常。

答案 1 :(得分:1)

在处理任何主要处理之前,此错误发生在页面的更高级别,并导致请求中止。

我相信你唯一的选择是在global.asax中处理Application_Error方法的异常,然后在需要时重定向到自定义错误页面。

答案 2 :(得分:0)

优雅地处理,你必须自己进行表单检查以找到错误,因此你必须为每个输入元素执行此操作,或者创建一个组件来解析发布的表单集合,这不是一件容易的事。 ..(或至少检查相关领域)。

然后您可以使用该消息重定向到错误页面。或者,如果你打开它,就像已经提到的那样处理Application_Error(或者可能是页面中的OnError方法),你可以将它们重定向到带有这条消息的错误页面,基本上做同样的事情。

答案 3 :(得分:0)

首先检查JavaScript,并立即显示错误消息。并且正如Mitchel所说,在Application_Error事件中复制此检查。