如何:显示安全错误信息
更新:2007 年 11 月
在您的应用程序显示错误信息时,它不应该泄露有助于恶意用户攻击您系统的信息。例如,如果您的应用程序试图登录数据库时没有成功,则显示的错误信息不应该包括它正在使用的用户名。
有许多方法可以控制错误信息,包括:
将应用程序配置为不向远程用户显示详细错误信息。(远程用户是指在 Web 服务器计算机上工作但未请求页的用户。)您也可以选择将错误重定向到应用程序页。
只要可行就包括错误处理,并编写您自己的错误信息。在您的错误处理程序中,可以进行测试以确定用户是否为本地用户并做出相应的响应。
在捕捉所有未处理异常并将它们发送到一般错误页的页级别或应用程序级别上,创建全局错误处理程序。这样,即使您没有预料到某个问题,至少用户不会看到异常页。
将应用程序配置为不向远程用户显示错误
在应用程序的 Web.config 文件中,对 customErrors 元素进行以下更改:
将 mode 属性设置为 RemoteOnly(区分大小写)。这就将应用程序配置为仅向本地用户(即,您 - 开发人员)显示详细的错误。
(可选)包括指向应用程序错误页的 defaultRedirect 属性。
(可选)包括将错误重定向到特定页的 <error> 元素。例如,您可以将标准 404 错误(未找到页)重定向到您自己的应用程序页。
下面的代码示例显示 Web.config 文件中的典型 customErrors 块。
<customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx"> <error statusCode="404" redirect="NoSuchPage.aspx"/> <error statusCode="403" redirect="NoAccessAllowed.aspx"/> </customErrors>
包括错误处理
在任何可能生成错误的语句周围使用一个 try-catch 块。
可以选择使用 IsLocal 属性对本地用户进行测试并相应地修改错误处理。值 127.0.0.1 等效于 localhost,指示浏览器与 Web 服务器位于同一台计算机上。
下面的代码示例显示一个错误处理块。如果发生错误,则用有关消息的详细信息加载 Session 状态变量,然后应用程序显示可以读取 Session 变量并显示错误的页。(有意写入此错误以便不向用户提供任何可利用的详细信息。)如果用户是本地用户,则提供不同的错误详细信息。在 finally 块中,释放开放式资源。
Try SqlConnection1.Open() SqlDataAdapter1.Fill(Me.DsPubs1) Catch ex As Exception If Request.IsLocal Then Session("CurrentError") = ex.Message Else Session("CurrentError") = "Error processing page." End If Server.Transfer("ApplicationError.aspx") Finally SqlConnection1.Close() End Try
try { sqlConnection1.Open(); sqlDataAdapter1.Fill(dsCustomers1); } catch (Exception ex) { if(Request.IsLocal) { Session["CurrentError"] = ex.Message; } else { Session["CurrentError"] = "Error processing page."; } Server.Transfer("ApplicationError.aspx"); } finally { this.sqlConnection1.Close(); }
创建全局错误处理程序
您也可以创建一个这样的错误处理程序,它在页级别上或为整个应用程序捕捉所有未处理的异常。
创建全局错误处理程序
若要在页中创建全局处理程序,请创建 TemplateControl.Error 事件的处理程序。若要创建应用程序范围的错误处理程序,请在 Global.asax 文件中将代码添加到 HttpApplication.Error 事件。只要您的页或应用程序中发生未处理的异常,就会相应地调用这些方法。您可以从 GetLastError 方法获取有关最新错误的信息。
说明: 如果您具有全局错误处理程序,则它优先于在 customErrors 配置元素的 defaultRedirect 属性中指定的错误处理。
下面的代码示例显示一个处理程序,它获取有关当前错误的信息,将其放在 Session 变量中,然后调用可以提取和显示错误信息的一般性错误处理页。
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Session("CurrentError") = "Global: " & _ Server.GetLastError.Message Server.Transfer("lasterr.aspx") End Sub
protected void Application_Error(Object sender, EventArgs e) { Session["CurrentError"] = "Global: " + Server.GetLastError().Message; Server.Transfer("lasterr.aspx"); }