在您的应用程序显示错误信息时,它不应该泄露有助于恶意用户攻击您系统的信息。例如,如果您的应用程序试图登录数据库时没有成功,则显示的错误信息不应该包括它正在使用的用户名。
有许多方法可以控制错误信息:
将应用程序配置为不向远程用户显示错误
以下示例显示 Web.config 文件中的典型 customErrors 块。
<customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx"> <error statusCode="404" redirect="NoSuchPage.aspx"/> <error statusCode="403" redirect="NoAccessAllowed.aspx"/> </customErrors>包括错误处理
下面显示的是一个示例错误处理块。如果发生错误,则用有关消息的详细信息加载 Session 状态变量,然后应用程序显示可以读取 Session 变量并显示错误的页。(有意写入此错误以便不向用户提供任何可利用的详细信息。)如果用户是本地用户,则提供不同的错误详细信息。在 finally 块中,释放开放式资源。
' Visual Basic Try SqlConnection1.Open() SqlDataAdapter1.Fill(Me.DsPubs1) Catch ex As Exception If HttpContext.Current.Request.UserHostAddress = "127.0.0.1" Then Session("CurrentError") = ex.Message Else Session("CurrentError") = "Error processing page." End If Server.Transfer("ApplicationError.aspx") Finally SqlConnection1.Close() End Try // C# try { sqlConnection1.Open(); sqlDataAdapter1.Fill(dsCustomers1); } catch (Exception ex) { if(HttpContext.Current.Request.UserHostAddress == "127.0.0.1") { Session["CurrentError"] = ex.Message; } else { Session["CurrentError"] = "Error processing page."; } Server.Transfer("ApplicationError.aspx"); } finally { this.sqlConnection1.Close(); }您也可以创建一个这样的错误处理程序,它在页级别上或为整个应用程序捕捉所有未处理的异常。
创建全局错误处理程序
下面显示的是一个示例处理程序,它获取有关当前错误的信息,将其放在 Session 变量中,并调用可以提取和显示错误信息的一般错误处理页。
' Visual Basic Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Session("CurrentError") = "Global: " & Server.GetLastError.Message Server.Transfer("lasterr.aspx") End Sub // C# protected void Application_Error(Object sender, EventArgs e) { Session["CurrentError"] = "Global: " + Server.GetLastError().Message; Server.Transfer("lasterr.aspx"); }