Gewusst wie: Anzeigen von sicheren Fehlermeldungen
Aktualisiert: November 2007
Die von der Anwendung angezeigten Fehlermeldungen sollten keine Informationen enthalten, die von böswilligen Benutzern für einen Angriff auf Ihr System genutzt werden könnten. Wenn die Anwendung beispielsweise erfolglos versucht, sich bei einer Datenbank anzumelden, sollte die daraufhin ausgegebene Fehlermeldung keine Hinweise auf den verwendeten Benutzernamen enthalten.
Zum Steuern der Fehlermeldungen können Sie verschiedene Verfahren einschließlich der folgenden verwenden:
Konfigurieren Sie die Anwendung so, dass Remotebenutzer keine ausführlichen Fehlermeldungen erhalten. (Remotebenutzer sind diejenigen, die keine Seiten anfordern, während sie am Webservercomputer arbeiten.) Optional können Sie Fehler an eine Seite innerhalb der Anwendung umleiten.
Sehen Sie ausreichende Möglichkeiten zur Fehlerbehandlung vor, und erstellen Sie eigene Fehlermeldungen. Im Fehlerhandler können Sie prüfen, ob der Benutzer lokal angemeldet ist, und entsprechend reagieren.
Erstellen Sie auf der Seiten- oder Anwendungsebene einen globalen Fehlerhandler, der alle nicht verarbeiteten Ausnahmefehler erfasst und sie an eine generische Fehlerseite weiterleitet. Dadurch erreichen Sie, dass Benutzern auch bei unvorhergesehenen Problemen keine Ausnahmefehlerseite angezeigt wird.
So deaktivieren Sie in Ihrer Anwendung die Ausgabe von Fehlern an Remotebenutzer
Nehmen Sie in der Web.config-Datei für Ihre Anwendung folgende Änderungen am customErrors-Element vor:
Legen Sie für das mode-Attribut den Wert RemoteOnly fest (Groß/Kleinschreibung beachten). Dadurch wird die Anwendung so konfiguriert, dass ausführliche Fehler nur lokalen Benutzern (d. h. Ihnen, dem Entwickler) angezeigt werden.
Fügen Sie optional ein defaultRedirect-Attribut hinzu, dass auf eine Fehlerseite in der Anwendung verweist.
Fügen Sie optional <error>-Elemente hinzu, die bestimmte Fehler an spezifische Seiten weiterleiten. Sie können beispielsweise Standardfehler des Typs 404 (Seite nicht gefunden) an Ihre eigene Anwendungsseite weiterleiten.
Im nachstehenden Codebeispiel wird ein typischer customErrors -Block in der Web.config-Datei veranschaulicht.
<customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx"> <error statusCode="404" redirect="NoSuchPage.aspx"/> <error statusCode="403" redirect="NoAccessAllowed.aspx"/> </customErrors>
So fügen Sie die Fehlerbehandlung hinzu
Verwenden Sie einen try-catch-Block um alle Anweisungen herum, die möglicherweise Fehler generieren.
Überprüfen Sie optional mit der IsLocal-Eigenschaft, ob ein Benutzer lokal angemeldet ist, und ändern Sie Fehlerbehandlung dementsprechend. Der Wert 127.0.0.1 entspricht localhost und gibt an, dass sich der Browser auf demselben Computer wie der Webserver befindet.
Im folgenden Codebeispiel wird einen Fehlerbehandlungsblock veranschaulicht. Wenn ein Fehler auftritt, wird eine Sitzungszustandsvariable mit Details zur Meldung geladen. Die Anwendung zeigt daraufhin eine Seite an, die die Session-Variable auslesen kann und die entsprechende Fehlermeldung anzeigt. (Die Fehlermeldung wird explizit so formuliert, dass Benutzer daraus keine wichtigen Informationen ableiten können.) Lokalen Benutzern werden dagegen detailliertere Fehlermeldungen angezeigt. Im finally-Block wird eine offene Ressource freigegeben.
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(); }
Erstellen eines globalen Fehlerhandlers
Sie können auch einen Fehlerhandler erstellen, der entweder auf der Seitenebene oder für die gesamte Anwendung alle unbehandelten Fehler erfasst.
So erstellen Sie einen globalen Fehlerhandler
Um einen globalen Handler auf einer Seite zu generieren, erstellen Sie zunächst einen Handler für das TemplateControl.Error-Ereignis. Um einen anwendungsübergreifenden Fehlerhandler zu erstellen, fügen Sie in der Datei Global.asax dem HttpApplication.Error-Ereignis Code hinzu. Diese Methoden werden aufgerufen, wenn an einer beliebigen Stelle auf der Seite oder innerhalb der Anwendung ein unbehandelter Fehler auftritt. Mit der GetLastError-Methode können Sie Informationen zum zuletzt aufgetretenen Fehler abrufen.
Hinweis: Wenn Sie einen globalen Fehlerhandler verwenden, hat dieser Vorrang vor der im defaultRedirect-Attribut des customErrors-Konfigurationselements festgelegten Fehlerbehandlung.
Im folgenden Codebeispiel wird ein Handler veranschaulicht, der Informationen zum aktuellen Fehler abruft, diese in eine Session-Variable schreibt und anschließend eine generische Fehlerbehandlungsseite aufruft, die die Fehlerinformationen extrahieren und anzeigen kann.
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"); }