【问题标题】:Handling Request Validation 'silently'“静默”处理请求验证
【发布时间】:2009-02-02 03:28:44
【问题描述】:

我正在尝试覆盖 Web 表单的 onError 事件处理程序,以允许在表单中处理“从客户端检测到潜在危险的 Request.Form 值”类型错误,而不是在应用程序级别错误结束处理程序。

我发现了一些这样的示例代码:

   protected override void OnError(EventArgs e)
{
    // At this point we have information about the error
    HttpContext ctx = HttpContext.Current;

    Exception exception = ctx.Server.GetLastError();

    string errorInfo =
       "<br>Offending URL: " + ctx.Request.Url.ToString() +
       "<br>Source: " + exception.Source +
       "<br>Message: " + exception.Message +
       "<br>Stack trace: " + exception.StackTrace;

    ctx.Response.Write(errorInfo);

    // --------------------------------------------------
    // To let the page finish running we clear the error
    // --------------------------------------------------
    ctx.Server.ClearError();

    base.OnError(e);

}

这令人满意地捕获了错误并将错误消息写入屏幕,但我真正想做的是在 Page_Load 触发时注意错误,以便能够在网络表单上显示“正常”错误消息。

我确信有一个好方法可以做到这一点,但我不知道!建议?

(顺便说一句,出于各种原因,我不想在表单或应用程序级别关闭检查,我也不希望依赖 Javascript - 谢谢)

【问题讨论】:

    标签: asp.net validation events


    【解决方案1】:

    您实际上可以在页面级别捕获错误,但它会终止页面生命周期。所以你必须使用一个技巧来绕过它。示例:

    public override void ProcessRequest(HttpContext context)
    {
      try
      {
        base.ProcessRequest(context);
      }
      catch(HttpRequestValidationException ex)
      {
          context.Response.Redirect("HandleValidationError.aspx");
      }
    }
    

    HandleValidationError.aspx 可以是任何东西,包括重定向回同一页面(可能带有包含错误信息的查询字符串,例如“ContactForm.aspx?error=Invalid+Request”)

    【讨论】:

      【解决方案2】:

      我想我明白你想做什么,但恐怕这不可能。当您的 ASP.NET 页面执行回发时,会在服务器上创建一个新线程来处理请求。在您的页面生命周期甚至有机会开始之前,就会发现有问题的 XSS 并引发异常。一旦抛出此异常,您将被“驱逐”出 ASP.NET 页面生命周期,并且无法重新进入它。此时,您在客户端唯一可以做的就是输出错误,或者重定向到错误页面。

      您似乎想要做的是捕获异常,将其写在页面上的某个位置,然后继续 ASP.NET 页面生命周期(即恢复控件树、恢复视图状态、调用事件处理程序等)。问题是一旦抛出未处理的异常,您就无法再访问 ASP.NET 页面生命周期。在这种特殊情况下,没有地方可以放置 try/catch 块,因为异常是在调用您自己的代码之前从 ASP.NET 生命周期内部引发的。

      我知道您说过您不想依赖 Javascript,但在这种情况下,我认为使用 Javascript 是获得所需行为的唯一方法。您仍然可以保留服务器端验证,以防万一您的用户禁用 Javascript 或键入一些您的 Javascript 无法处理的输入。

      【讨论】:

        【解决方案3】:

        我认为您无法处理 Page_load 事件中的错误。在页面加载后发生ASP.NET Page Life cycle 验证事件。

        也许您可以添加一个隐藏的 div (

        杰森

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-02
          • 2018-03-27
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多