Cómo: Mostrar mensajes de error seguros

Actualización: noviembre 2007

Cuando la aplicación muestra mensajes de error, no debería incluir información que un usuario malintencionado pudiera encontrar útil para atacar el sistema. Por ejemplo, si la aplicación intenta sin éxito iniciar una sesión con una base de datos, no debería mostrar un mensaje de error que incluyera el nombre de usuario que está utilizando.

Existen diversas formas de controlar los mensajes de error, entre las que se encuentran las siguientes:

  • Configure la aplicación para que no muestre errores detallados a los usuarios remotos. (Los usuarios remotos son aquéllos que no solicitan páginas mientras trabajan con el equipo del servidor Web). Como opción, puede redirigir los errores a una página de aplicación.

  • Incluya control de errores siempre que sea viable y cree sus propios mensajes de error. En el controlador de errores puede comprobar si el usuario es local y reaccionar en consecuencia.

  • Cree un controlador de errores global en el nivel de página o de aplicación que capture todas las excepciones no controladas y las encamine a una página de error genérica. De este modo, aunque no se haya anticipado al problema, al menos los usuarios no verán una página de excepción.

Para configurar la aplicación de forma que se deshabiliten los errores para los usuarios remotos

  • En el archivo Web.config de la aplicación, realice los cambios siguientes en el elemento customErrors:

    • Establezca el atributo mode en RemoteOnly (se distingue entre mayúsculas y minúsculas). De este modo se configura la aplicación para que sólo se muestren errores detallados a los usuarios locales (es decir, al usuario, el desarrollador).

    • También puede incluir un atributo defaultRedirect que señale a una página de error de la aplicación.

    • Como alternativa, incluya elementos <error> que redirijan errores específicos a páginas específicas. Por ejemplo, puede redirigir los errores 404 estándar (no se encontró la página) a su propia página de aplicación.

    En el siguiente ejemplo de código se muestra un bloque customErrors típico en el archivo Web.config.

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

Para incluir control de errores

  1. Utilice un bloque try-catch alrededor de cualquier instrucción que pudiera generar errores.

  2. También puede comprobar un usuario local con la propiedad IsLocal y modificar en consecuencia el control de errores. El valor 127.0.0.1 equivale a localhost e indica que el explorador está en el mismo equipo que el servidor Web.

    En el ejemplo de código siguiente se muestra un bloque de control de errores. Si se produce un error, se carga una variable de estado de sesión con detalles sobre el mensaje y, a continuación, la aplicación muestra una página que puede leer la variable Session y mostrar el error (que está escrito de forma deliberada de modo que no proporcione detalles que el usuario pudiera utilizar). Si el usuario es local, se proporcionan detalles de error distintos. En el bloque finally se libera un recurso abierto.

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

Crear un controlador de errores global

También puede crear un controlador de errores que capture todas las excepciones no controladas en el nivel de la página o de la aplicación como entidad.

Para crear un controlador de errores global

  • Para crear un controlador global en una página, cree un controlador para el evento TemplateControl.Error. Para crear un controlador de errores en el nivel de la aplicación, agregue código al evento HttpApplication.Error en el archivo Global.asax. De este modo, si se produce una excepción no controlada en cualquier lugar de la página o de la aplicación, se llamará a uno de estos métodos, según corresponda. Puede obtener información sobre el error más reciente con el método GetLastError.

    Nota:

    Si tiene un controlador de errores global, éste tendrá prioridad sobre el control de errores especificado en el atributo defaultRedirect del elemento de configuración customErrors.

    En el ejemplo de código siguiente se muestra un controlador que obtiene información sobre el error actual, la incluye en una variable Session y después invoca a una página de control de errores genérica que puede extraer y mostrar la información de error.

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

Vea también

Otros recursos

Proteger sitios web ASP.NET