Comment : afficher des messages d'erreur sécurisés

Mise à jour : novembre 2007

Les messages d'erreur affichés par votre application ne doivent pas donner d'informations susceptibles d'être utilisées par un utilisateur malveillant pour attaquer votre système. Par exemple, si votre application ne parvient pas à se connecter à une base de données, elle ne doit pas afficher de message d'erreur comprenant le nom d'utilisateur utilisé.

Vous pouvez contrôler les messages d'erreurs de différentes manières, parmi lesquelles :

  • Configurez l'application de sorte que les messages d'erreur détaillés ne s'affichent pas à l'attention des utilisateurs distants. (Les utilisateurs distants sont ceux qui ne demandent pas de pages lorsqu'ils travaillent sur l'ordinateur serveur Web.) Vous pouvez également rediriger les erreurs vers une page d'application.

  • Incluez, dans la mesure du possible, une gestion des erreurs et créez vos propres messages d'erreur. Vous pouvez effectuer un test dans votre gestionnaire d'erreurs pour savoir si l'utilisateur est un utilisateur local et agir en conséquence.

  • Créez un gestionnaire d'erreurs globales au niveau de la page ou de l'application qui intercepte toutes les exceptions non gérées et les route vers une page d'erreurs générique. Ainsi, même si vous n'avez pas anticipé un problème, les utilisateurs ne verront pas s'afficher une page d'exceptions.

Pour configurer l'application afin de désactiver les erreurs à l'attention des utilisateurs distants

  • Dans le fichier Web.config de votre application, modifiez l'élément customErrors comme suit :

    • Affectez RemoteOnly (en respectant la casse) à l'attribut mode. L'application est ainsi configurée pour n'afficher les erreurs détaillées qu'à l'attention des utilisateurs locaux (c'est-à-dire à vous, le développeur).

    • Incluez éventuellement un attribut defaultRedirect pointant vers une page d'erreurs d'application.

    • Incluez éventuellement des éléments <error> redirigeant des erreurs spécifiques vers des pages spécifiques. Vous pouvez, par exemple, rediriger les erreurs 404 standard (page non trouvée) vers votre propre page d'application.

    L'exemple ci-dessous montre un bloc customErrors classique dans le fichier Web.config.

    <customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx"> 
       <error statusCode="404" redirect="NoSuchPage.aspx"/> 
       <error statusCode="403" redirect="NoAccessAllowed.aspx"/> 
    </customErrors> 
    

Pour inclure une gestion des erreurs

  1. Délimitez toute instruction susceptible de générer des erreurs par un bloc try-catch.

  2. Vous pouvez également vérifier si l'utilisateur est un utilisateur local à l'aide de la propriété IsLocal et modifier la gestion des erreurs en conséquence. La valeur 127.0.0.1 équivaut à localhost et indique que le navigateur est sur le même ordinateur que le serveur Web.

    L'exemple de code ci-dessous montre un bloc de gestion des erreurs. En cas d'erreur, une variable d'état de session est chargée avec des informations détaillées sur le message, puis l'application affiche une page capable de lire la variable Session et d'afficher l'erreur. (L'erreur est écrite de façon à ne fournir aucune information exploitable à l'utilisateur.) S'il s'agit d'un utilisateur local, des informations détaillées sur l'erreur s'affichent. Dans le bloc finally, une ressource ouverte est libérée.

    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();
    }
    

Création d'un gestionnaire d'erreurs globales

Vous pouvez également créer un gestionnaire d'erreurs qui intercepte toutes les exceptions non gérées au niveau de la page ou au niveau de l'application elle-même.

Pour créer un gestionnaire d'erreurs globales

  • Pour créer un gestionnaire d'erreurs globales dans une page, créez un gestionnaire pour l'événement TemplateControl.Error. Pour créer un gestionnaire d'erreurs au niveau de l'application, ajoutez du code, dans le fichier Global.asax, à l'événement HttpApplication.Error. Ces méthodes sont appelées si une exception non gérée se produit dans votre page ou votre application, respectivement. Vous pouvez obtenir des informations sur la dernière erreur survenue à l'aide de la méthode GetLastError.

    Remarque :

    Si vous disposez d'un gestionnaire d'erreurs globales, celui-ci est prioritaire sur la gestion des erreurs spécifiée dans l'attribut defaultRedirect de l'élément de configuration customErrors.

    L'exemple de code suivant montre un gestionnaire qui obtient des informations sur l'erreur en cours, les place dans une variable Session, puis appelle une page de gestion des erreurs générique capable de récupérer et d'afficher les informations relatives à l'erreur.

    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");
    }
    

Voir aussi

Autres ressources

Sécurisation de sites Web ASP.NET