在您的应用程序显示错误信息时,它不应该泄露有助于恶意用户攻击您系统的信息。例如,如果您的应用程序试图登录数据库时没有成功,则显示的错误信息不应该包括它正在使用的用户名。
有许多方法可以控制错误信息:
- 将应用程序配置为不向远程(应用程序)用户显示详细错误信息。您也可以选择将错误重定向到应用程序页。
- 只要可行就包括错误处理,并编写您自己的错误信息。在您的错误处理程序中,您可以进行测试以确定用户是否为本地用户并作出相应的响应。
- 在捕捉所有未处理异常并将它们发送到一般错误页的页级别或应用程序级别上,创建全局错误处理程序。这样,即使您没有预料到某个问题,至少用户不会看到异常页。
将应用程序配置为不向远程用户显示错误
- 在应用程序的 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-finally 块。
- (可选)使用 context 对象的 asp”>userhostaddress 属性对本地用户进行测试并相应地修改错误处理。值 127.0.0.1 等效于“localhost”并指示浏览器与 web 服务器位于同一台计算机上。
下面显示的是一个示例错误处理块。如果发生错误,则用有关消息的详细信息加载 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(); }
您也可以创建一个这样的错误处理程序,它在页级别上或为整个应用程序捕捉所有未处理的异常。
创建全局错误处理程序
- 要创建页中的全局处理程序,请创建 asp”>page_error 事件的处理程序。要创建应用程序范围的错误处理程序,请在 global.asax 文件中将代码添加到 asp”>application_error 方法。只要您的页或应用程序中发生未处理的异常,就会调用这些方法。您可以从 asp”>httpserverutility.getlasterror 方法获取有关最新错误的信息。
注意 如果您具有全局错误处理程序,则它优先于在 web.config customerrors 元素的 defaultredirect 属性中指定的错误处理。
下面显示的是一个示例处理程序,它获取有关当前错误的信息,将其放在 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"); }