Delen via


Beveiligingsframe: Uitzonderingsbeheer | Oplossingen

Product/Service Artikel
WCF
Web-API
Webapplicatie

WCF- Neem geen serviceDebug-knooppunt op in het configuratiebestand

Titel Details
Onderdeel WCF
SDL-fase Bouwen
Toepasselijke technologieën Algemeen, NET Framework 3
Kenmerken N/A
Verwijzingen MSDN, Fortify Kingdom
Stappen Windows WCF-services (Communication Framework) kunnen worden geconfigureerd om foutopsporingsgegevens beschikbaar te maken. Foutopsporingsinformatie mag niet worden gebruikt in productieomgevingen. De <serviceDebug> tag bepaalt of de functie voor foutopsporingsinformatie is ingeschakeld voor een WCF-service. Als het kenmerk includeExceptionDetailInFaults is ingesteld op true, wordt uitzonderingsinformatie van de toepassing aan clients geretourneerd. Aanvallers kunnen gebruikmaken van de aanvullende informatie die ze krijgen van foutopsporingsuitvoer om aanvallen te koppelen 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: serviceMetadata-knooppunt niet opnemen in het configuratiebestand

Titel Details
Onderdeel WCF
SDL-fase Bouwen
Toepasselijke technologieën Algemeen
Kenmerken Algemeen, NET Framework 3
Verwijzingen MSDN, Fortify Kingdom
Stappen Door informatie over een service openbaar te maken, kunnen aanvallers waardevolle inzichten krijgen in hoe ze de service kunnen exploiteren. Met <serviceMetadata> de tag wordt de functie voor het publiceren van metagegevens ingeschakeld. Servicemetagegevens kunnen gevoelige informatie bevatten die niet openbaar toegankelijk mag zijn. U kunt ten minste vertrouwde gebruikers toegang geven tot de metagegevens en ervoor zorgen dat onnodige informatie niet beschikbaar wordt gesteld. 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 afhandeling van uitzonderingen wordt uitgevoerd in ASP.NET Web API

Titel Details
Onderdeel Web-API
SDL-fase Bouwen
Toepasselijke technologieën MVC 5, MVC 6
Kenmerken N/A
Verwijzingen Exception Handling in ASP.NET Web API, Model Validation in ASP.NET Web API
Stappen Standaard worden de meeste onopgeslagen uitzonderingen in ASP.NET Web API omgezet in een HTTP-antwoord met statuscode 500, Internal Server Error

Voorbeeld

Als u de statuscode wilt beheren die door de API wordt geretourneerd, HttpResponseException kunt u deze gebruiken 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 verdere 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;
}

Uitzonderingsfilters kunnen worden gebruikt om niet-verwerkte uitzonderingen te ondervangen die niet van het type HttpResponseExceptionzijn. Uitzonderingsfilters implementeren de System.Web.Http.Filters.IExceptionFilter interface. De eenvoudigste manier om een uitzonderingsfilter te schrijven, is om af te leiden van de System.Web.Http.Filters.ExceptionFilterAttribute klasse en de OnException-methode 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:

  • Per actie
  • Per controller
  • Wereldwijd

Voorbeeld

Als u het filter wilt toepassen op een specifieke actie, voegt u het filter toe als een kenmerk 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 toe als een kenmerk 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 een 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 met verwijzingen voor meer informatie over uitzonderlijke verwerking en modelvalidatie in ASP.NET Web API

Beveiligingsdetails niet weergeven in foutberichten

Titel Details
Onderdeel Webapplicatie
SDL-fase Bouwen
Toepasselijke technologieën Algemeen
Kenmerken N/A
Verwijzingen N/A
Stappen

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

  • Servernamen
  • Aansluitstrengen
  • Gebruikersnamen
  • Passwords
  • SQL-procedures
  • Details van dynamische SQL-fouten
  • Stack trace en coderegels
  • Variabelen die zijn opgeslagen in het geheugen
  • Schijf- en mappenlocaties
  • Toepassingsinstallatiepunten
  • Hostconfiguratie-instellingen
  • Overige interne toepassingsgegevens

Het opvangen van alle fouten binnen een toepassing en het verstrekken van generieke foutberichten, evenals het inschakelen van aangepaste foutmeldingen in IIS, helpt informatie openbaarmaking te voorkomen. SQL Server database, en .NET afhandeling van uitzonderingen, onder andere architecturen voor foutafhandeling, zijn met name uitgebreid en zeer nuttig voor een kwaadwillende gebruiker die uw toepassing profileert. Geef niet rechtstreeks de inhoud van een klasse weer die is afgeleid van de klasse .NET Uitzondering en zorg ervoor dat u de juiste afhandeling van uitzonderingen hebt, zodat een onverwachte uitzondering niet per ongeluk rechtstreeks naar de gebruiker wordt verheven.

  • Geef de gebruiker algemene foutmeldingen die specifieke details, aanwezig in de uitzondering/foutmelding, vervangen door generieke berichten.
  • De inhoud van een .NET uitzonderingsklasse niet rechtstreeks aan de gebruiker weergeven
  • Vang alle foutmeldingen op en informeer de gebruiker indien nodig via een algemeen foutbericht dat naar de applicatieclient wordt verstuurd
  • Maak 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 meer onschuldig bericht weergeven aan de gebruiker

Standaardpagina voor foutafhandeling implementeren

Titel Details
Onderdeel Webapplicatie
SDL-fase Bouwen
Toepasselijke technologieën Algemeen
Kenmerken N/A
Verwijzingen 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 een functieconfiguratie (zoals Aanvraagfiltering) voorkomt dat een pagina wordt weergegeven, wordt er een foutbericht gegenereerd. Beheerders kunnen kiezen of de toepassing een beschrijvend bericht moet weergeven aan de client, een gedetailleerd foutbericht aan de client of alleen een gedetailleerd foutbericht aan localhost. De <customErrors> tag in de web.config heeft drie modi:

  • Op: Geeft aan dat aangepaste fouten zijn ingeschakeld. Als er geen defaultRedirect-kenmerk is opgegeven, zien gebruikers een algemene fout. De aangepaste fouten worden weergegeven voor de externe clients en de lokale host
  • Uit: Hiermee geeft u aan dat op maat gemaakte fouten zijn uitgeschakeld. De gedetailleerde ASP.NET fouten worden weergegeven voor de externe clients en de lokale host
  • RemoteOnly: Geeft aan 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 <customErrors mode="RemoteOnly" /> of <customErrors mode="On" /> gedefinieerd heeft.

Implementatiemethode instellen op detailhandel in IIS

Titel Details
Onderdeel Webapplicatie
SDL-fase Implementatie
Toepasselijke technologieën Algemeen
Kenmerken N/A
Verwijzingen deploymentelement (schema voor ASP.NET instellingen)
Stappen

De <deployment retail> switch is bedoeld voor gebruik door IIS-productieservers. Deze switch wordt gebruikt om toepassingen te helpen bij het uitvoeren van de best mogelijke prestaties en het minst mogelijke beveiligingsinformatielekken door de mogelijkheid van de toepassing uit te schakelen om traceringsuitvoer op een pagina te genereren, de mogelijkheid uit te schakelen om gedetailleerde foutberichten aan eindgebruikers weer te geven en de foutopsporingsswitch uit te schakelen.

Vaak worden schakelopties en opties die zijn gericht op ontwikkelaars, zoals tracering van mislukte aanvragen en foutopsporing, ingeschakeld tijdens actieve ontwikkeling. Het wordt aanbevolen om de deploymethode op iedere productieserver in te stellen op retail. Open het bestand machine.config en zorg ervoor dat <deployment retail="true" /> ingesteld blijft op true.

Uitzonderingen moeten veilig mislukken

Titel Details
Onderdeel Webapplicatie
SDL-fase Bouwen
Toepasselijke technologieën Algemeen
Kenmerken N/A
Verwijzingen Beveiligd falen
Stappen De toepassing moet op een veilige manier falen. Elke methode die een Booleaanse waarde retourneert, op basis waarvan bepaalde beslissingen worden genomen, moet een uitzonderingsblok hebben dat zorgvuldig is 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 True, als er een uitzondering optreedt. Als de eindgebruiker een ongeldige URL biedt, die de browser respecteert, maar de Uri() constructor dit niet doet, wordt er een uitzondering gegenereerd en wordt het slachtoffer naar de geldige maar onjuiste URL gebracht.