Delen via


Beveiligingsframe: uitzonderingsbeheer | Oplossingen

Product/service Artikel
WCF
Web-API
Webtoepassing

WCF- ServiceDebug-knooppunt niet opnemen in configuratiebestand

Titel Details
Onderdeel WCF
SDL-fase Build
Toepasselijke technologieën Algemeen, NET Framework 3
Kenmerken N.v.t.
Referenties MSDN, Fortify Kingdom
Stappen WCF-services (Windows Communication Framework) kunnen worden geconfigureerd om foutopsporingsgegevens beschikbaar te maken. Foutopsporingsinformatie mag niet worden gebruikt in productieomgevingen. De <serviceDebug> tag definieert of de functie voor foutopsporingsinformatie is ingeschakeld voor een WCF-service. Als het kenmerk includeExceptionDetailInFaults is ingesteld op true, worden uitzonderingsgegevens van de toepassing geretourneerd naar clients. Aanvallers kunnen gebruikmaken van de aanvullende informatie die ze krijgen van foutopsporingsuitvoer om aanvallen te implementeren die zijn gericht op het framework, de database of andere resources die door de toepassing worden gebruikt.

Voorbeeld

Het volgende configuratiebestand bevat de <serviceDebug> tag:

<configuration> 
<system.serviceModel> 
<behaviors> 
<serviceBehaviors> 
<behavior name=""MyServiceBehavior""> 
<serviceDebug includeExceptionDetailInFaults=""True"" httpHelpPageEnabled=""True""/> 
... 

Schakel foutopsporingsgegevens in de service uit. Dit kan worden bereikt door de tag te verwijderen uit het <serviceDebug> configuratiebestand van uw toepassing.

WCF- Neem het serviceMetadata-knooppunt niet op in het configuratiebestand

Titel Details
Onderdeel WCF
SDL-fase Build
Toepasselijke technologieën Algemeen
Kenmerken Algemeen, NET Framework 3
Referenties MSDN, Fortify Kingdom
Stappen Het openbaar maken van informatie over een service kan aanvallers waardevolle inzichten geven in hoe ze de service kunnen misbruiken. Met <serviceMetadata> de tag wordt de functie voor het publiceren van metagegevens ingeschakeld. Servicemetagegevens kunnen gevoelige informatie bevatten die niet openbaar toegankelijk mag zijn. Geef ten minste alleen vertrouwde gebruikers toegang tot de metagegevens en zorg ervoor dat onnodige informatie niet wordt weergegeven. Nog beter, schakel de mogelijkheid om metagegevens te publiceren volledig uit. Een veilige WCF-configuratie bevat de <serviceMetadata> tag niet.

Zorg ervoor dat de juiste uitzonderingsafhandeling wordt uitgevoerd in ASP.NET web-API

Titel Details
Onderdeel Web-API
SDL-fase Build
Toepasselijke technologieën MVC 5, MVC 6
Kenmerken N.v.t.
Referenties Uitzonderingsafhandeling in ASP.NET web-API, modelvalidatie in ASP.NET web-API
Stappen Standaard worden de meeste onondertekende uitzonderingen in ASP.NET web-API omgezet in een HTTP-antwoord met statuscode 500, Internal Server Error

Voorbeeld

Voor het beheren van de statuscode die door de API wordt geretourneerd, HttpResponseException kan worden gebruikt zoals hieronder wordt weergegeven:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    return item;
}

Voorbeeld

Voor meer controle over het uitzonderingsantwoord kan de HttpResponseMessage klasse worden gebruikt zoals hieronder wordt weergegeven:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
        {
            Content = new StringContent(string.Format("No product with ID = {0}", id)),
            ReasonPhrase = "Product ID Not Found"
        }
        throw new HttpResponseException(resp);
    }
    return item;
}

Als u niet-verwerkte uitzonderingen wilt ondervangen die niet van het type HttpResponseExceptionzijn, kunnen uitzonderingsfilters worden gebruikt. Uitzonderingsfilters implementeren de System.Web.Http.Filters.IExceptionFilter interface. De eenvoudigste manier om een uitzonderingsfilter te schrijven, is door af te leiden van de System.Web.Http.Filters.ExceptionFilterAttribute klasse en de methode OnException te overschrijven.

Voorbeeld

Hier volgt een filter waarmee uitzonderingen worden geconverteerd NotImplementedException naar HTTP-statuscode 501, Not Implemented:

namespace ProductStore.Filters
{
    using System;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http.Filters;

    public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            if (context.Exception is NotImplementedException)
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
            }
        }
    }
}

Er zijn verschillende manieren om een web-API-uitzonderingsfilter te registreren:

  • Op actie
  • Per controller
  • Wereldwijd

Voorbeeld

Als u het filter wilt toepassen op een specifieke actie, voegt u het filter als kenmerk toe aan de actie:

public class ProductsController : ApiController
{
    [NotImplExceptionFilter]
    public Contact GetContact(int id)
    {
        throw new NotImplementedException("This method is not implemented");
    }
}

Voorbeeld

Als u het filter wilt toepassen op alle acties op een controller, voegt u het filter als kenmerk toe aan de controller klasse:

[NotImplExceptionFilter]
public class ProductsController : ApiController
{
    // ...
}

Voorbeeld

Als u het filter globaal wilt toepassen op alle web-API-controllers, voegt u een exemplaar van het filter toe aan de GlobalConfiguration.Configuration.Filters verzameling. Uitzonderingsfilters in deze verzameling zijn van toepassing op elke web-API-controlleractie.

GlobalConfiguration.Configuration.Filters.Add(
    new ProductStore.NotImplExceptionFilterAttribute());

Voorbeeld

Voor modelvalidatie kan de modelstatus worden doorgegeven aan de methode CreateErrorResponse, zoals hieronder wordt weergegeven:

public HttpResponseMessage PostProduct(Product item)
{
    if (!ModelState.IsValid)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
    // Implementation not shown...
}

Raadpleeg de koppelingen in de sectie verwijzingen voor meer informatie over uitzonderlijke verwerking en modelvalidatie in ASP.NET Web API

Beveiligingsdetails niet weergeven in foutberichten

Titel Details
Onderdeel Webtoepassing
SDL-fase Build
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Referenties N.v.t.
Stappen

Algemene foutberichten worden rechtstreeks aan de gebruiker verstrekt zonder gevoelige toepassingsgegevens op te geven. Voorbeelden van gevoelige gegevens zijn:

  • Servernamen
  • Verbindingsreeksen
  • Gebruikersnamen
  • Wachtwoorden
  • SQL-procedures
  • Details van dynamische SQL-fouten
  • Stack-tracering en coderegels
  • Variabelen die zijn opgeslagen in het geheugen
  • Stations- en maplocaties
  • Toepassingsinstallatiepunten
  • Instellingen voor hostconfiguratie
  • Overige interne toepassingsdetails

Door alle fouten in een toepassing op te vangen en algemene foutberichten op te geven, en aangepaste fouten in IIS in te schakelen, wordt het vrijgeven van informatie voorkomen. SQL Server database- en .NET-uitzonderingsafhandeling, naast andere architecturen voor foutafhandeling, zijn vooral uitgebreid en uiterst nuttig voor kwaadwillende gebruikers die uw toepassing profileren. Geef de inhoud van een klasse die is afgeleid van de .NET-uitzonderingsklasse niet rechtstreeks weer en zorg ervoor dat u de juiste uitzonderingsafhandeling hebt, zodat een onverwachte uitzondering niet per ongeluk rechtstreeks aan de gebruiker wordt gemeld.

  • Algemene foutberichten rechtstreeks aan de gebruiker verstrekken die specifieke details weghalen die rechtstreeks in het uitzonderings-/foutbericht zijn gevonden
  • De inhoud van een .NET-uitzonderingsklasse niet rechtstreeks weergeven aan de gebruiker
  • Alle foutberichten overvallen en zo nodig de gebruiker informeren via een algemeen foutbericht dat naar de toepassingsclient wordt verzonden
  • Stel de inhoud van de uitzonderingsklasse niet rechtstreeks beschikbaar voor de gebruiker, met name de retourwaarde van .ToString(), of de waarden van de eigenschappen Message of StackTrace. Deze informatie veilig registreren en een onschuldiger bericht voor de gebruiker weergeven

Pagina Standaard foutafhandeling implementeren

Titel Details
Onderdeel Webtoepassing
SDL-fase Build
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Referenties Het dialoogvenster Instellingen voor ASP.NET-foutpagina's bewerken
Stappen

Wanneer een ASP.NET toepassing mislukt en een http/1.x 500 interne serverfout veroorzaakt, of wanneer een functieconfiguratie (zoals Aanvraagfiltering) verhindert dat een pagina wordt weergegeven, wordt er een foutbericht gegenereerd. Beheerders kunnen kiezen of de toepassing een beschrijvend bericht voor de client, een gedetailleerd foutbericht aan de client of een gedetailleerd foutbericht alleen voor localhost moet weergeven. De <customErrors> tag in de web.config heeft drie modi:

  • Op: Hiermee geeft u op dat aangepaste fouten zijn ingeschakeld. Als er geen kenmerk defaultRedirect is opgegeven, zien gebruikers een algemene fout. De aangepaste fouten worden weergegeven aan de externe clients en aan de lokale host
  • Uit: Hiermee geeft u op dat aangepaste fouten zijn uitgeschakeld. De gedetailleerde ASP.NET fouten worden weergegeven aan de externe clients en aan de lokale host
  • RemoteOnly: Hiermee geeft u op dat aangepaste fouten alleen worden weergegeven voor de externe clients en dat ASP.NET fouten worden weergegeven aan de lokale host. Dit is de standaardwaarde

Open het web.config bestand voor de toepassing/site en zorg ervoor dat de tag of <customErrors mode="RemoteOnly" /><customErrors mode="On" /> is gedefinieerd.

Implementatiemethode instellen op Detailhandel in IIS

Titel Details
Onderdeel Webtoepassing
SDL-fase Implementatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Referenties implementatie-element (ASP.NET-instellingenschema)
Stappen

De <deployment retail> switch is bedoeld voor gebruik door IIS-productieservers. Deze schakeloptie wordt gebruikt om toepassingen uit te voeren met de best mogelijke prestaties en zo min mogelijk lekken van beveiligingsgegevens door de mogelijkheid van de toepassing om traceringsuitvoer op een pagina te genereren uit te schakelen, de mogelijkheid om gedetailleerde foutberichten weer te geven aan eindgebruikers uit te schakelen en de schakeloptie voor foutopsporing uit te schakelen.

Schakelopties en opties die op ontwikkelaars zijn gericht, zoals tracering van mislukte aanvragen en foutopsporing, worden vaak ingeschakeld tijdens actieve ontwikkeling. Het wordt aanbevolen om de implementatiemethode op een productieserver in te stellen op detailhandel. open het bestand machine.config en zorg ervoor dat deze <deployment retail="true" /> ingesteld blijft op true.

Uitzonderingen moeten veilig mislukken

Titel Details
Onderdeel Webtoepassing
SDL-fase Build
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Referenties Veilig mislukken
Stappen De toepassing moet veilig mislukken. Elke methode die een Booleaanse waarde retourneert, op basis waarvan een bepaalde beslissing wordt genomen, moet zorgvuldig een uitzonderingsblok hebben gemaakt. Er zijn veel logische fouten waardoor beveiligingsproblemen zich voordoen wanneer het uitzonderingsblok onzorgvuldig wordt geschreven.

Voorbeeld

        public static bool ValidateDomain(string pathToValidate, Uri currentUrl)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(pathToValidate))
                {
                    var domain = RetrieveDomain(currentUrl);
                    var replyPath = new Uri(pathToValidate);
                    var replyDomain = RetrieveDomain(replyPath);

                    if (string.Compare(domain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
                    {
                        //// Adding additional check to enable CMS urls if they are not hosted on same domain.
                        if (!string.IsNullOrWhiteSpace(Utilities.CmsBase))
                        {
                            var cmsDomain = RetrieveDomain(new Uri(Utilities.Base.Trim()));
                            if (string.Compare(cmDomain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
                            {
                                return false;
                            }
                            else
                            {
                                return true;
                            }
                        }

                        return false;
                    }
                }

                return true;
            }
            catch (UriFormatException ex)
            {
                LogHelper.LogException("Utilities:ValidateDomain", ex);
                return true;
            }
        }

De bovenstaande methode retourneert altijd Waar als er een uitzondering optreedt. Als de eindgebruiker een onjuiste URL opgeeft, die de browser respecteert, maar de Uri() constructor niet, treedt er een uitzondering op en wordt het slachtoffer naar de geldige, maar onjuiste URL gebracht.