Delen via


Beveiligingsframe: Invoervalidatie | Oplossingen

Product/service Artikel
Webtoepassing
Database
Web-API
Azure Document DB
WCF

XSLT-scripting uitschakelen voor alle transformaties met niet-vertrouwde opmaakmodellen

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie XSLT-beveiliging, Xslt Instellingen. EnableScript-eigenschap
Stappen XSLT biedt ondersteuning voor scripting in opmaakmodellen met behulp van het <msxml:script> element. Hierdoor kunnen aangepaste functies worden gebruikt in een XSLT-transformatie. Het script wordt uitgevoerd onder de context van het proces dat de transformatie uitvoert. XSLT-script moet worden uitgeschakeld in een niet-vertrouwde omgeving om te voorkomen dat niet-vertrouwde code wordt uitgevoerd. Als u .NET gebruikt: XSLT-scripts zijn standaard uitgeschakeld. U moet er echter voor zorgen dat het niet expliciet is ingeschakeld via de XsltSettings.EnableScript eigenschap.

Opmerking

XsltSettings settings = new XsltSettings();
settings.EnableScript = true; // WRONG: THIS SHOULD BE SET TO false

Opmerking

Als u MSXML 6.0 gebruikt, is XSLT-scripting standaard uitgeschakeld; U moet er echter voor zorgen dat deze niet expliciet is ingeschakeld via de xml DOM-objecteigenschap AllowXsltScript.

doc.setProperty("AllowXsltScript", true); // WRONG: THIS SHOULD BE SET TO false

Opmerking

Als u MSXML 5 of lager gebruikt, is XSLT-scripting standaard ingeschakeld en moet u het expliciet uitschakelen. Stel de eigenschap AllowXsltScript van het XML DOM-object in op false.

doc.setProperty("AllowXsltScript", false); // CORRECT. Setting to false disables XSLT scripting.

Zorg ervoor dat elke pagina die besturingselementbare inhoud van de gebruiker kan bevatten, zich afmeldt voor automatische MIME-sniffing

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie IE8 Security Part V - Uitgebreide beveiliging
Stappen

Voor elke pagina die gebruikersbesturingselementbare inhoud kan bevatten, moet u de HTTP-header X-Content-Type-Options:nosniffgebruiken. Als u aan deze vereiste wilt voldoen, kunt u de vereiste koptekstpagina instellen op pagina voor alleen pagina's die gebruikersbeheerbare inhoud kunnen bevatten, of u kunt deze globaal instellen voor alle pagina's in de toepassing.

Elk type bestand dat van een webserver wordt geleverd, heeft een gekoppeld MIME-type (ook wel een inhoudstype genoemd) dat de aard van de inhoud beschrijft (dat wil gezegd: afbeelding, tekst, toepassing, enzovoort)

De header X-Content-Type-Options is een HTTP-header waarmee ontwikkelaars kunnen opgeven dat hun inhoud niet MIME-sniffed mag zijn. Deze header is ontworpen om MIME-Sniffing-aanvallen te beperken. Ondersteuning voor deze header is toegevoegd in Internet Explorer 8 (IE8)

Alleen gebruikers van Internet Explorer 8 (IE8) profiteren van X-Content-Type-Options. Eerdere versies van Internet Explorer respecteren momenteel de header X-Content-Type-Options niet

Internet Explorer 8 (en hoger) zijn de enige belangrijke browsers om een opt-outfunctie voor MIME-sniffing te implementeren. Als en wanneer andere belangrijke browsers (Firefox, Safari, Chrome) vergelijkbare functies implementeren, wordt deze aanbeveling bijgewerkt om ook syntaxis voor deze browsers op te nemen

Opmerking

Als u de vereiste header globaal wilt inschakelen voor alle pagina's in de toepassing, kunt u een van de volgende handelingen uitvoeren:

  • Voeg de header toe aan het web.config-bestand als de toepassing wordt gehost door IIS (Internet Information Services) 7
<system.webServer> 
  <httpProtocol> 
    <customHeaders> 
      <add name=""X-Content-Type-Options"" value=""nosniff""/>
    </customHeaders>
  </httpProtocol>
</system.webServer> 
  • Voeg de header toe via de globale Application_BeginRequest
void Application_BeginRequest(object sender, EventArgs e)
{
  this.Response.Headers[""X-Content-Type-Options""] = ""nosniff"";
} 
  • Aangepaste HTTP-module implementeren
public class XContentTypeOptionsModule : IHttpModule 
  {
    #region IHttpModule Members 
    public void Dispose() 
    { 

    } 
    public void Init(HttpApplication context)
    { 
      context.PreSendRequestHeaders += newEventHandler(context_PreSendRequestHeaders); 
    } 
    #endregion 
    void context_PreSendRequestHeaders(object sender, EventArgs e) 
      { 
        HttpApplication application = sender as HttpApplication; 
        if (application == null) 
          return; 
        if (application.Response.Headers[""X-Content-Type-Options ""] != null) 
          return; 
        application.Response.Headers.Add(""X-Content-Type-Options "", ""nosniff""); 
      } 
  } 

  • U kunt de vereiste header alleen inschakelen voor specifieke pagina's door deze toe te voegen aan afzonderlijke antwoorden:
this.Response.Headers[""X-Content-Type-Options""] = ""nosniff""; 

Xml-entiteitsomzetting beperken of uitschakelen

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie XML Entity Expansion, XML Denial of Service Attacks and Defenses, MSXML Security Overview, Best Practices for Securing MSXML Code, NSXMLParserDelegate Protocol Reference, Resolving External References
Stappen

Hoewel het niet veel wordt gebruikt, is er een functie van XML waarmee de XML-parser macro-entiteiten kan uitbreiden met waarden die zijn gedefinieerd in het document zelf of vanuit externe bronnen. Het document kan bijvoorbeeld een entiteit 'bedrijfsnaam' definiëren met de waarde 'Microsoft', zodat telkens wanneer de tekst '&companyname;' wordt weergegeven in het document, deze automatisch wordt vervangen door de tekst Microsoft. Of het document kan een entiteit 'MSFTStock' definiëren die verwijst naar een externe webservice om de huidige waarde van microsoft-aandelen op te halen.

Telkens wanneer '&MSFTStock;' wordt weergegeven in het document, wordt deze automatisch vervangen door de huidige aandelenkoers. Deze functionaliteit kan echter worden misbruikt om DoS-voorwaarden (Denial of Service) te maken. Een aanvaller kan meerdere entiteiten nesten om een exponentiële UITBREIDINGs-XML-bom te maken die alle beschikbare geheugen op het systeem verbruikt.

Hij kan ook een externe verwijzing maken die een oneindige hoeveelheid gegevens terugstroomt of die gewoon de thread vastloopt. Als gevolg hiervan moeten alle teams interne en/of externe XML-entiteitsomzetting volledig uitschakelen als hun toepassing deze niet gebruikt, of de hoeveelheid geheugen en tijd die de toepassing kan gebruiken voor entiteitsomzetting handmatig beperken als deze functionaliteit absoluut noodzakelijk is. Als entiteitsomzetting niet vereist is voor uw toepassing, schakelt u deze uit.

Opmerking

Voor .NET Framework-code kunt u de volgende methoden gebruiken:

XmlTextReader reader = new XmlTextReader(stream);
reader.ProhibitDtd = true;

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = true;
XmlReader reader = XmlReader.Create(stream, settings);

// for .NET 4
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
XmlReader reader = XmlReader.Create(stream, settings);

Houd er rekening mee dat de standaardwaarde ProhibitDtd XmlReaderSettings waar is, maar in XmlTextReader de waarde onwaar is. Als u XmlReader gebruikt Instellingen, hoeft u ProhibitDtd niet expliciet in te stellen op true, maar het wordt aanbevolen voor de veiligheid. Houd er ook rekening mee dat de XmlDocument-klasse standaard entiteitsomzetting toestaat.

Opmerking

Als u entiteitsomzetting voor XmlDocuments wilt uitschakelen, gebruikt u de XmlDocument.Load(XmlReader) overbelasting van de methode Laden en stelt u de juiste eigenschappen in het argument XmlReader in om de oplossing uit te schakelen, zoals wordt geïllustreerd in de volgende code:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = true;
XmlReader reader = XmlReader.Create(stream, settings);
XmlDocument doc = new XmlDocument();
doc.Load(reader);

Opmerking

Als het uitschakelen van entiteitsomzetting niet mogelijk is voor uw toepassing, stelt u de XmlReader in Instellingen. De eigenschap MaxCharactersFromEntities naar een redelijke waarde op basis van de behoeften van uw toepassing. Dit beperkt de impact van mogelijke exponentiële uitbreidings doS-aanvallen. De volgende code bevat een voorbeeld van deze aanpak:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.MaxCharactersFromEntities = 1000;
XmlReader reader = XmlReader.Create(stream, settings);

Opmerking

Als u inlineentiteiten wilt oplossen, maar geen externe entiteiten hoeft op te lossen, stelt u de XmlReader in Instellingen. De eigenschap XmlResolver naar null. Voorbeeld:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.MaxCharactersFromEntities = 1000;
settings.XmlResolver = null;
XmlReader reader = XmlReader.Create(stream, settings);

In MSXML6 is ProhibitDTD standaard ingesteld op true (DTD-verwerking uitschakelen). Voor Apple OSX-/iOS-code zijn er twee XML-parsers die u kunt gebruiken: NSXMLParser en libXML2.

Toepassingen die gebruikmaken van http.sys voeren URL-canonicalisatieverificatie uit

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie N.v.t.
Stappen

Elke toepassing die gebruikmaakt van http.sys moet de volgende richtlijnen volgen:

  • Beperk de URL-lengte tot maximaal 16.384 tekens (ASCII of Unicode). Dit is de absolute maximale URL-lengte op basis van de standaardinstelling Internet Information Services (IIS) 6. Websites moeten streven naar een lengte korter dan dit indien mogelijk
  • Gebruik de standaard .NET Framework-klassen I/O-klassen (zoals FileStream) omdat deze profiteren van de canonicalisatieregels in de .NET FX
  • Expliciet een acceptatielijst met bekende bestandsnamen maken
  • Expliciet bekende bestandstypen weigeren die u niet zult verwerken UrlScan weigeren: exe, bat, cmd, com, htw, ida, idq, htr, idc, shtm[l], stm, printer, ini, pol, dat bestanden
  • De volgende uitzonderingen ondervangen:
    • System.ArgumentException (voor apparaatnamen)
    • System.NotSupportedException (voor gegevensstromen)
    • System.IO.FileNotFoundException (voor ongeldige escape-bestandsnamen)
    • System.IO.DirectoryNotFoundException (voor ongeldige escaped dirs)
  • Roep geen I/O-API's voor Win32-bestanden aan. Bij een ongeldige URL wordt een 400-fout naar de gebruiker geretourneerd en wordt de echte fout vastgelegd.

Zorg ervoor dat de juiste besturingselementen aanwezig zijn bij het accepteren van bestanden van gebruikers

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie Onbeperkte bestandsupload, tabel met bestandshandtekening
Stappen

Geüploade bestanden vormen een aanzienlijk risico voor toepassingen.

De eerste stap bij veel aanvallen is het ophalen van code voor het systeem dat moet worden aangevallen. Vervolgens hoeft de aanval alleen een manier te vinden om de code uit te voeren. Door een bestandsupload te gebruiken, kan de aanvaller de eerste stap uitvoeren. De gevolgen van onbeperkte bestandsupload kunnen variëren, waaronder volledige systeemovername, een overbelast bestandssysteem of een database, het doorsturen van aanvallen naar back-endsystemen en eenvoudige degradatie.

Het is afhankelijk van wat de toepassing doet met het geüploade bestand en met name waar het is opgeslagen. Validatie aan de serverzijde van bestandsuploads ontbreekt. De volgende beveiligingscontroles moeten worden geïmplementeerd voor de functionaliteit voor het uploaden van bestanden:

  • Controle van de bestandsextensie (alleen een geldige set toegestane bestandstypen moet worden geaccepteerd)
  • Maximale bestandsgrootte
  • Het bestand mag niet worden geüpload naar de webroot; de locatie moet een map op een niet-systeemstation zijn
  • Naamconventie moet worden gevolgd, zodat de geüploade bestandsnaam willekeurig is, om te voorkomen dat bestanden worden overschreven
  • Bestanden moeten worden gescand op antivirus voordat ze naar de schijf worden geschreven
  • Zorg ervoor dat de bestandsnaam en eventuele andere metagegevens (bijvoorbeeld bestandspad) zijn gevalideerd voor schadelijke tekens
  • Handtekening voor bestandsindeling moet worden gecontroleerd om te voorkomen dat een gebruiker een gemaskeerd bestand uploadt (bijvoorbeeld door een exe-bestand te uploaden door de extensie te wijzigen in txt)

Opmerking

Raadpleeg de onderstaande klasse voor meer informatie over de validatie van de handtekening voor bestandsindelingen:

        private static Dictionary<string, List<byte[]>> fileSignature = new Dictionary<string, List<byte[]>>
                    {
                    { ".DOC", new List<byte[]> { new byte[] { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 } } },
                    { ".DOCX", new List<byte[]> { new byte[] { 0x50, 0x4B, 0x03, 0x04 } } },
                    { ".PDF", new List<byte[]> { new byte[] { 0x25, 0x50, 0x44, 0x46 } } },
                    { ".ZIP", new List<byte[]> 
                                            {
                                              new byte[] { 0x50, 0x4B, 0x03, 0x04 },
                                              new byte[] { 0x50, 0x4B, 0x4C, 0x49, 0x54, 0x55 },
                                              new byte[] { 0x50, 0x4B, 0x53, 0x70, 0x58 },
                                              new byte[] { 0x50, 0x4B, 0x05, 0x06 },
                                              new byte[] { 0x50, 0x4B, 0x07, 0x08 },
                                              new byte[] { 0x57, 0x69, 0x6E, 0x5A, 0x69, 0x70 }
                                                }
                                            },
                    { ".PNG", new List<byte[]> { new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A } } },
                    { ".JPG", new List<byte[]>
                                    {
                                              new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 },
                                              new byte[] { 0xFF, 0xD8, 0xFF, 0xE1 },
                                              new byte[] { 0xFF, 0xD8, 0xFF, 0xE8 }
                                    }
                                    },
                    { ".JPEG", new List<byte[]>
                                        { 
                                            new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 },
                                            new byte[] { 0xFF, 0xD8, 0xFF, 0xE2 },
                                            new byte[] { 0xFF, 0xD8, 0xFF, 0xE3 }
                                        }
                                        },
                    { ".XLS", new List<byte[]>
                                            {
                                              new byte[] { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 },
                                              new byte[] { 0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00 },
                                              new byte[] { 0xFD, 0xFF, 0xFF, 0xFF }
                                            }
                                            },
                    { ".XLSX", new List<byte[]> { new byte[] { 0x50, 0x4B, 0x03, 0x04 } } },
                    { ".GIF", new List<byte[]> { new byte[] { 0x47, 0x49, 0x46, 0x38 } } }
                };

        public static bool IsValidFileExtension(string fileName, byte[] fileData, byte[] allowedChars)
        {
            if (string.IsNullOrEmpty(fileName) || fileData == null || fileData.Length == 0)
            {
                return false;
            }

            bool flag = false;
            string ext = Path.GetExtension(fileName);
            if (string.IsNullOrEmpty(ext))
            {
                return false;
            }

            ext = ext.ToUpperInvariant();

            if (ext.Equals(".TXT") || ext.Equals(".CSV") || ext.Equals(".PRN"))
            {
                foreach (byte b in fileData)
                {
                    if (b > 0x7F)
                    {
                        if (allowedChars != null)
                        {
                            if (!allowedChars.Contains(b))
                            {
                                return false;
                            }
                        }
                        else
                        {
                            return false;
                        }
                    }
                }

                return true;
            }

            if (!fileSignature.ContainsKey(ext))
            {
                return true;
            }

            List<byte[]> sig = fileSignature[ext];
            foreach (byte[] b in sig)
            {
                var curFileSig = new byte[b.Length];
                Array.Copy(fileData, curFileSig, b.Length);
                if (curFileSig.SequenceEqual(b))
                {
                    flag = true;
                    break;
                }
            }

            return flag;
        }

Zorg ervoor dat parameters voor typebeveiliging worden gebruikt in webtoepassing voor gegevenstoegang

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie N.v.t.
Stappen

Als u de verzameling Parameters gebruikt, behandelt SQL de invoer als een letterlijke waarde in plaats van als uitvoerbare code. De verzameling Parameters kan worden gebruikt om beperkingen voor type en lengte af te dwingen voor invoergegevens. Waarden buiten het bereik activeren een uitzondering. Als typeveilige SQL-parameters niet worden gebruikt, kunnen aanvallers mogelijk injectieaanvallen uitvoeren die zijn ingesloten in de niet-gefilterde invoer.

Gebruik veilige parameters van het type bij het maken van SQL-query's om mogelijke SQL-injectieaanvallen te voorkomen die kunnen optreden met niet-gefilterde invoer. U kunt typen veilige parameters gebruiken met opgeslagen procedures en met dynamische SQL-instructies. Parameters worden behandeld als letterlijke waarden door de database en niet als uitvoerbare code. Parameters worden ook gecontroleerd op type en lengte.

Opmerking

De volgende code laat zien hoe u veilige parameters van het type gebruikt met de SqlParameterCollection bij het aanroepen van een opgeslagen procedure.

using System.Data;
using System.Data.SqlClient;

using (SqlConnection connection = new SqlConnection(connectionString))
{ 
DataSet userDataset = new DataSet(); 
SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure", connection); 
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure; 
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11); 
myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text; 
myCommand.Fill(userDataset);
}  

In het voorgaande codevoorbeeld mag de invoerwaarde niet langer zijn dan 11 tekens. Als de gegevens niet voldoen aan het type of de lengte die is gedefinieerd door de parameter, genereert de sqlParameter-klasse een uitzondering.

Afzonderlijke modelbindingsklassen of bindingsfilterlijsten gebruiken om een beveiligingsprobleem met MVC-massatoewijzing te voorkomen

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën MVC5, MVC6
Kenmerken N.v.t.
Naslaginformatie Metagegevenskenmerken, beveiligingsprobleem en beperking van openbare sleutel, volledige handleiding voor massatoewijzing in ASP.NET MVC, aan de slag met EF met behulp van MVC
Stappen
  • Wanneer moet ik naar overpostende beveiligingsproblemen zoeken? - Beveiligingsproblemen die te veel worden geplaatst, kunnen zich voordoen op elke plaats waar u modelklassen bindt op basis van gebruikersinvoer. Frameworks zoals MVC kunnen gebruikersgegevens vertegenwoordigen in aangepaste .NET-klassen, waaronder Gewone oude CLR-objecten (POCOs). MVC vult deze modelklassen automatisch in met gegevens uit de aanvraag en biedt een handige weergave voor het verwerken van gebruikersinvoer. Wanneer deze klassen eigenschappen bevatten die niet door de gebruiker moeten worden ingesteld, kan de toepassing kwetsbaar zijn voor overpostingsaanvallen, waardoor gebruikersbeheer van gegevens die de toepassing nooit heeft bedoeld, is toegestaan. Net als MVC-modelbinding bieden databasetoegangstechnologieën zoals object-/relationele mappers zoals Entity Framework vaak ook ondersteuning voor het gebruik van POCO-objecten om databasegegevens weer te geven. Deze gegevensmodelklassen bieden hetzelfde gemak bij het verwerken van databasegegevens als MVC bij het verwerken van gebruikersinvoer. Omdat zowel MVC als de database vergelijkbare modellen ondersteunen, zoals POCO-objecten, lijkt het gemakkelijk om dezelfde klassen voor beide doeleinden opnieuw te gebruiken. Deze praktijk kan geen scheiding van problemen behouden en het is één gemeenschappelijk gebied waar onbedoelde eigenschappen worden blootgesteld aan modelbinding, waardoor overpostaanvallen mogelijk zijn.
  • Waarom moet ik mijn niet-gefilterde databasemodelklassen niet gebruiken als parameters voor mijn MVC-acties? - Omdat MVC-modelbinding alles in die klasse bindt. Zelfs als de gegevens niet in uw weergave worden weergegeven, kan een kwaadwillende gebruiker een HTTP-aanvraag verzenden met deze gegevens en MVC zal deze graag binden omdat uw actie aangeeft dat de databaseklasse de vorm is van gegevens die moeten worden geaccepteerd voor gebruikersinvoer.
  • Waarom geef ik om de vorm die wordt gebruikt voor modelbinding? - Door gebruik te maken van ASP.NET MVC-modelbinding met te brede modellen wordt een toepassing blootgesteld aan overpostingsaanvallen. Door overboeking kunnen aanvallers toepassingsgegevens wijzigen buiten wat de ontwikkelaar bedoelde, zoals het overschrijven van de prijs voor een item of de beveiligingsbevoegdheden voor een account. Toepassingen moeten actiespecifieke bindingsmodellen (of specifieke toegestane eigenschappenfilterlijsten) gebruiken om een expliciet contract op te geven voor wat niet-vertrouwde invoer toestaat via modelbinding.
  • Zijn er afzonderlijke bindingsmodellen die alleen code dupliceren? - Nee, het is een kwestie van scheiding van zorgen. Als u databasemodellen in actiemethoden opnieuw gebruikt, zegt u dat een eigenschap (of subeigenschap) in die klasse kan worden ingesteld door de gebruiker in een HTTP-aanvraag. Als dat niet is wat u wilt doen met MVC, hebt u een filterlijst of een afzonderlijke klasseshape nodig om MVC weer te geven welke gegevens afkomstig zijn van gebruikersinvoer.
  • Als ik afzonderlijke bindingsmodellen voor gebruikersinvoer heb, moet ik al mijn gegevensaantekeningskenmerken dupliceren? - Niet noodzakelijk. U kunt MetadataTypeAttribute in de databasemodelklasse gebruiken om een koppeling te maken naar de metagegevens op een modelbindingsklasse. Houd er rekening mee dat het type waarnaar wordt verwezen door de MetadataTypeAttribute een subset van het verwijzingstype moet zijn (het kan minder eigenschappen hebben, maar niet meer).
  • Het verplaatsen van gegevens tussen gebruikersinvoermodellen en databasemodellen is vervelend. Kan ik gewoon alle eigenschappen kopiëren met weerspiegeling? - Ja. De enige eigenschappen die in de bindingsmodellen worden weergegeven, zijn de eigenschappen die u hebt vastgesteld om veilig te zijn voor gebruikersinvoer. Er is geen beveiligingsreden die het gebruik van weerspiegeling voorkomt om alle eigenschappen te kopiëren die gemeenschappelijk zijn tussen deze twee modellen.
  • Hoe zit het met [Bind(Exclude ="â€...")]. Kan ik dat gebruiken in plaats van afzonderlijke bindingsmodellen te gebruiken? - Deze methode wordt niet aanbevolen. Als u [Bind(Exclude ="â€...")] gebruikt, betekent dit dat elke nieuwe eigenschap standaard bindbaar is. Wanneer een nieuwe eigenschap wordt toegevoegd, is er een extra stap die u moet onthouden om dingen veilig te houden in plaats van het ontwerp standaard te beveiligen. Afhankelijk van de ontwikkelaar die deze lijst controleert telkens wanneer een eigenschap wordt toegevoegd, riskant is.
  • Is [Bind(Include ="â€...")] handig voor bewerkingen bewerken? - Nee [Bind(Include ="â€...")] is alleen geschikt voor INSERT-stijlbewerkingen (nieuwe gegevens toevoegen). Voor bewerkingen in UPDATE-stijl (bestaande gegevens herzien), gebruikt u een andere benadering, zoals het hebben van afzonderlijke bindingsmodellen of het doorgeven van een expliciete lijst met toegestane eigenschappen aan UpdateModel of TryUpdateModel. Als u een kenmerk [Bind(Include ="â€...")] toevoegt aan een bewerking Bewerken, betekent dit dat MVC een objectexemplaren maakt en alleen de vermelde eigenschappen instelt, waardoor alle andere waarden behouden blijven. Wanneer de gegevens worden bewaard, worden de bestaande entiteit volledig vervangen en worden de waarden voor eventuele weggelaten eigenschappen opnieuw ingesteld op de standaardwaarden. Als bijvoorbeeld Is Beheer is weggelaten uit een kenmerk [Bind(Include ="â€...")] bij een bewerking bewerken, wordt elke gebruiker waarvan de naam via deze actie is bewerkt, opnieuw ingesteld op Is Beheer = false (elke bewerkte gebruiker verliest de beheerdersstatus). Als u updates voor bepaalde eigenschappen wilt voorkomen, gebruikt u een van de andere methoden hierboven. Houd er rekening mee dat sommige versies van MVC-hulpprogramma's controllerklassen genereren met [Bind(Include ="â€...")] bij bewerkingen en impliceren dat het verwijderen van een eigenschap uit die lijst over-boekingsaanvallen voorkomt. Zoals hierboven is beschreven, werkt deze benadering echter niet zoals bedoeld en worden in plaats daarvan gegevens in de weggelaten eigenschappen opnieuw ingesteld op de standaardwaarden.
  • Voor bewerkingen maken zijn er opmerkingen met behulp van [Bind(Include ="â€...")] in plaats van afzonderlijke bindingsmodellen? - Ja. Deze aanpak werkt eerst niet voor bewerkingsscenario's, waarbij twee afzonderlijke benaderingen nodig zijn voor het beperken van alle overpostende beveiligingsproblemen. Ten tweede dwingen afzonderlijke bindingsmodellen scheiding van zorgen af tussen de vorm die wordt gebruikt voor gebruikersinvoer en de shape die wordt gebruikt voor persistentie, iets wat [Bind(Include ="â€...")] niet doet. Ten derde: [Bind(Include ="â€...")] kan alleen eigenschappen op het hoogste niveau verwerken; u kunt niet alleen delen van subeigenschappen (zoals 'Details.Name') in het kenmerk toestaan. Ten slotte, en misschien het belangrijkste, voegt het gebruik van [Bind(Include ="â€...")] een extra stap toe die moet worden onthouden wanneer de klasse wordt gebruikt voor modelbinding. Als een nieuwe actiemethode rechtstreeks aan de gegevensklasse bindt en vergeet een kenmerk [Bind(Include ="â€")] op te nemen, kan deze kwetsbaar zijn voor overpostaanvallen, zodat de benadering [Bind(Include ="â€...")] iets minder veilig is. Als u [Bind(Include ="â€")] gebruikt, moet u er altijd voor zorgen dat u deze telkens opgeeft wanneer uw gegevensklassen worden weergegeven als actiemethodeparameters.
  • Voor bewerkingen maken moet u het kenmerk [Bind(Include ="â€...")] op de modelklasse zelf plaatsen? Vermijdt deze aanpak dat u het kenmerk niet op elke actiemethode moet plaatsen? - Deze aanpak werkt in sommige gevallen. Als u [Bind(Include ="â€")] gebruikt voor het modeltype zelf (in plaats van op actieparameters die deze klasse gebruiken), hoeft u niet te onthouden dat het kenmerk [Bind(Include ="â€...")] moet worden opgenomen voor elke actiemethode. Door het kenmerk rechtstreeks op de klasse te gebruiken, maakt u effectief een afzonderlijk oppervlak van deze klasse voor modelbindingsdoeleinden. Met deze benadering is echter slechts één modelbindingsshape per modelklasse mogelijk. Als een actiemethode modelbinding van een veld moet toestaan (bijvoorbeeld een actie die alleen beheerder is die gebruikersrollen bijwerkt) en andere acties moeten modelbinding van dit veld voorkomen, werkt deze benadering niet. Elke klasse kan slechts één modelbindingsshape hebben; als verschillende acties verschillende shapes voor modelbinding nodig hebben, moeten ze deze afzonderlijke shapes vertegenwoordigen met behulp van afzonderlijke modelbindingsklassen of afzonderlijke kenmerken van [Bind(Include ="â€...")] voor de actiemethoden.
  • Wat zijn bindingsmodellen? Zijn ze hetzelfde als weergavemodellen? - Dit zijn twee gerelateerde concepten. Het termbindingsmodel verwijst naar een modelklasse die wordt gebruikt in de parameterlijst van een actie (de shape die wordt doorgegeven vanuit MVC-modelbinding aan de actiemethode). Het model voor de termweergave verwijst naar een modelklasse die wordt doorgegeven vanuit een actiemethode aan een weergave. Het gebruik van een weergavespecifiek model is een algemene benadering voor het doorgeven van gegevens van een actiemethode aan een weergave. Deze shape is vaak ook geschikt voor modelbinding en het termweergavemodel kan worden gebruikt om te verwijzen naar hetzelfde model dat op beide plaatsen wordt gebruikt. Om precies te zijn, praat deze procedure specifiek over bindingsmodellen, gericht op de vorm die wordt doorgegeven aan de actie, wat belangrijk is voor massatoewijzingsdoeleinden.

Niet-vertrouwde webuitvoer coderen vóór rendering

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen, Webformulieren, MVC5, MVC6
Kenmerken N.v.t.
Naslaginformatie Het voorkomen van cross-site scripting in ASP.NET, cross-site scripting, XSS (cross-site scripting) preventie cheatsheet
Stappen Scripting op meerdere sites (meestal afgekort als XSS) is een aanvalsvector voor onlineservices of een toepassing/onderdeel dat invoer van het web verbruikt. Met XSS-beveiligingsproblemen kan een aanvaller een script uitvoeren op de computer van een andere gebruiker via een kwetsbare webtoepassing. Schadelijke scripts kunnen worden gebruikt om cookies te stelen en anderszins manipulatie te maken met de machine van een slachtoffer via JavaScript. XSS wordt voorkomen door gebruikersinvoer te valideren, ervoor te zorgen dat deze goed is gevormd en gecodeerd voordat deze wordt weergegeven op een webpagina. Invoervalidatie en uitvoercodering kunnen worden uitgevoerd met behulp van webbeveiligingsbibliotheek. Gebruik voor beheerde code (C#, VB.NET enzovoort) een of meer geschikte coderingsmethoden uit de webbeveiligingsbibliotheek (Anti-XSS), afhankelijk van de context waarin de gebruikersinvoer wordt gemanifesteerd:

Opmerking

* Encoder.HtmlEncode 
* Encoder.HtmlAttributeEncode 
* Encoder.JavaScriptEncode 
* Encoder.UrlEncode
* Encoder.VisualBasicScriptEncode 
* Encoder.XmlEncode 
* Encoder.XmlAttributeEncode 
* Encoder.CssEncode 
* Encoder.LdapEncode 

Invoervalidatie en filtering uitvoeren op alle eigenschappen van het tekenreekstype Model

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen, MVC5, MVC6
Kenmerken N.v.t.
Naslaginformatie Validatie toevoegen, modelgegevens valideren in een MVC-toepassing, richtlijnen voor uw ASP.NET MVC-toepassingen
Stappen

Alle invoerparameters moeten worden gevalideerd voordat ze in de toepassing worden gebruikt om ervoor te zorgen dat de toepassing wordt beveiligd tegen schadelijke gebruikersinvoer. Valideer de invoerwaarden met behulp van reguliere expressievalidaties aan de serverzijde met een validatiestrategie voor toegestane lijsten. Niet-toegestane gebruikersinvoer/-parameters die aan de methoden worden doorgegeven, kunnen beveiligingsproblemen met code-injectie veroorzaken.

Voor webtoepassingen kunnen invoerpunten ook formuliervelden, QueryStrings, cookies, HTTP-headers en webserviceparameters bevatten.

De volgende controles voor invoervalidatie moeten worden uitgevoerd bij modelbinding:

  • De modeleigenschappen moeten worden geannoteerd met RegularExpression-aantekening, voor het accepteren van toegestane tekens en maximale toegestane lengte
  • De controllermethoden moeten modelstate-geldigheid uitvoeren

Opschoning moet worden toegepast op formuliervelden die alle tekens accepteren, zoals rtf-teksteditor

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie Onveilige invoer coderen, HTML-opschoning
Stappen

Identificeer alle statische markeringstags die u wilt gebruiken. Een veelvoorkomende procedure is het beperken van opmaak tot veilige HTML-elementen, zoals <b> (vet) en <i> (cursief).

Voordat u de gegevens schrijft, moet u deze coderen met HTML. Hierdoor is elk schadelijk script veilig doordat het wordt verwerkt als tekst, niet als uitvoerbare code.

  1. Schakel ASP.NET aanvraagvalidatie uit door het kenmerk ValidateRequest="false" toe te voegen aan de @Page-instructie
  2. De tekenreeksinvoer coderen met de HtmlEncode-methode
  3. Gebruik een StringBuilder en roep de replace-methode aan om de codering selectief te verwijderen van de HTML-elementen die u wilt toestaan

De pagina-in de verwijzingen schakelt ASP.NET aanvraagvalidatie uit door de instelling in te stellen ValidateRequest="false". Met HTML-codering wordt de invoer gecodeerd en kan ook <b> <i> een .NET-bibliotheek voor HTML-opschoning worden gebruikt.

HtmlSanitizer is een .NET-bibliotheek voor het opschonen van HTML-fragmenten en documenten van constructies die kunnen leiden tot XSS-aanvallen. Het maakt gebruik van AngleSharp om HTML en CSS te parseren, bewerken en renderen. HtmlSanitizer kan worden geïnstalleerd als een NuGet-pakket en de gebruikersinvoer kan worden doorgegeven via relevante HTML- of CSS-opschoningsmethoden, indien van toepassing, aan de serverzijde. Houd er rekening mee dat opschoning als een beveiligingscontrole alleen als laatste optie moet worden beschouwd.

Invoervalidatie en uitvoercodering worden beschouwd als betere beveiligingscontroles.

DOM-elementen niet toewijzen aan sinks die geen ingebouwde codering hebben

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie N.v.t.
Stappen Veel JavaScript-functies voeren standaard geen codering uit. Wanneer u niet-vertrouwde invoer toewijst aan DOM-elementen via dergelijke functies, kan dit leiden tot xss-uitvoeringen (cross-site script).

Opmerking

Hieronder volgen onveilige voorbeelden:

document.getElementByID("div1").innerHtml = value;
$("#userName").html(res.Name);
return $('<div/>').html(value)
$('body').append(resHTML);   

Gebruik niet innerHtml; gebruik innerTextin plaats daarvan . Gebruik op dezelfde manier in plaats van $("#elm").html()$("#elm").text()

Controleer of alle omleidingen in de toepassing zijn gesloten of veilig worden uitgevoerd

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie Het OAuth 2.0 Authorization Framework - Open Redirectors
Stappen

Het toepassingsontwerp waarvoor omleiding naar een door de gebruiker opgegeven locatie vereist, moet de mogelijke omleidingsdoelen beperken tot een vooraf gedefinieerde lijst met 'veilige' sites of domeinen. Alle omleidingen in de toepassing moeten worden gesloten/veilig.

Dit doet u als volgt:

  • Alle omleidingen identificeren
  • Implementeer een geschikte beperking voor elke omleiding. De juiste oplossingen omvatten omleidingslijst of bevestiging van de gebruiker. Als een website of service met een open omleidingsprobleem gebruikmaakt van Facebook/OAuth/OpenID-id-providers, kan een aanvaller het aanmeldingstoken van een gebruiker stelen en deze gebruiker imiteren. Dit is een inherent risico bij het gebruik van OAuth, dat wordt beschreven in RFC 6749 "The OAuth 2.0 Authorization Framework", Section 10.15 "Open Redirects" Op dezelfde manier kunnen de referenties van gebruikers worden aangetast door spear phishing-aanvallen met behulp van open omleidingen

Invoervalidatie implementeren voor alle parameters van het tekenreekstype die worden geaccepteerd door controllermethoden

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen, MVC5, MVC6
Kenmerken N.v.t.
Naslaginformatie Modelgegevens valideren in een MVC-toepassing, richtlijnen voor uw ASP.NET MVC-toepassingen
Stappen Voor methoden die alleen primitieve gegevenstypen accepteren en niet modellen als argument, moet de invoervalidatie met behulp van de reguliere expressie worden uitgevoerd. Hier moet Regex.IsMatch worden gebruikt met een geldig regex-patroon. Als de invoer niet overeenkomt met de opgegeven reguliere expressie, mag het besturingselement niet verder gaan en moet er een adequate waarschuwing over validatiefouten worden weergegeven.

Een time-out voor de bovengrens instellen voor reguliere expressieverwerking om DoS te voorkomen vanwege slechte reguliere expressies

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën Algemeen, Webformulieren, MVC5, MVC6
Kenmerken N.v.t.
Naslaginformatie Eigenschap DefaultRegexMatchTimeout
Stappen Om denial of service-aanvallen te garanderen tegen slecht gemaakte reguliere expressies, die veel backtracking veroorzaken, stelt u de globale standaardtime-out in. Als de verwerkingstijd langer duurt dan de gedefinieerde bovengrens, treedt er een time-outuitzondering op. Als er niets is geconfigureerd, is de time-out oneindig.

Opmerking

Met de volgende configuratie wordt bijvoorbeeld een RegexMatchTimeoutException gegenereerd als de verwerking langer dan 5 seconden duurt:

<httpRuntime targetFramework="4.5" defaultRegexMatchTimeout="00:00:05" />

Vermijd het gebruik van Html.Raw in Razor-weergaven

Titel DETAILS
Onderdeel Webtoepassing
SDL-fase Compilatie
Toepasselijke technologieën MVC5, MVC6
Kenmerken N.v.t.
Naslaginformatie N.v.t.
Stap ASP.NET WebPages (Razor) automatische HTML-codering uitvoeren. Alle tekenreeksen die door ingesloten codenuggets (@ blokken) worden afgedrukt, worden automatisch met HTML gecodeerd. Wanneer HtmlHelper.Raw de methode echter wordt aangeroepen, worden markeringen geretourneerd die geen HTML-codering hebben. Als Html.Raw() de helpermethode wordt gebruikt, wordt de automatische coderingsbeveiliging die Razor biedt, overgeslagen.

Opmerking

Hier volgt een onveilig voorbeeld:

<div class="form-group">
            @Html.Raw(Model.AccountConfirmText)
        </div>
        <div class="form-group">
            @Html.Raw(Model.PaymentConfirmText)
        </div>
</div>

Gebruik deze functie alleen Html.Raw() als u markeringen moet weergeven. Deze methode voert geen impliciete uitvoercodering uit. Andere ASP.NET helpers gebruiken, bijvoorbeeld @Html.DisplayFor()

Gebruik geen dynamische query's in opgeslagen procedures

Titel DETAILS
Onderdeel Database
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie N.v.t.
Stappen

Bij een SQL-injectieaanval worden beveiligingsproblemen in de invoervalidatie misbruikt om willekeurige opdrachten uit te voeren in de database. Dit kan gebeuren wanneer uw toepassing invoer gebruikt om dynamische SQL-instructies te maken voor toegang tot de database. Dit kan ook gebeuren als uw code gebruikmaakt van opgeslagen procedures die zijn doorgegeven aan tekenreeksen die onbewerkte gebruikersinvoer bevatten. Met behulp van de SQL-injectieaanval kan de aanvaller willekeurige opdrachten uitvoeren in de database. Alle SQL-instructies (inclusief de SQL-instructies in opgeslagen procedures) moeten worden geparameteriseerd. Geparameteriseerde SQL-instructies accepteren tekens die speciale betekenis hebben voor SQL (zoals enkele aanhalingstekens) zonder problemen, omdat ze sterk zijn getypt.

Opmerking

Hieronder volgt een voorbeeld van onveilige dynamische opgeslagen procedure:

CREATE PROCEDURE [dbo].[uspGetProductsByCriteria]
(
  @productName nvarchar(200) = NULL,
  @startPrice float = NULL,
  @endPrice float = NULL
)
AS
 BEGIN
  DECLARE @sql nvarchar(max)
  SELECT @sql = ' SELECT ProductID, ProductName, Description, UnitPrice, ImagePath' +
       ' FROM dbo.Products WHERE 1 = 1 '
       PRINT @sql
  IF @productName IS NOT NULL
     SELECT @sql = @sql + ' AND ProductName LIKE ''%' + @productName + '%'''
  IF @startPrice IS NOT NULL
     SELECT @sql = @sql + ' AND UnitPrice > ''' + CONVERT(VARCHAR(10),@startPrice) + ''''
  IF @endPrice IS NOT NULL
     SELECT @sql = @sql + ' AND UnitPrice < ''' + CONVERT(VARCHAR(10),@endPrice) + ''''

  PRINT @sql
  EXEC(@sql)
 END

Opmerking

Hieronder volgt dezelfde opgeslagen procedure die veilig is geïmplementeerd:

CREATE PROCEDURE [dbo].[uspGetProductsByCriteriaSecure]
(
             @productName nvarchar(200) = NULL,
             @startPrice float = NULL,
             @endPrice float = NULL
)
AS
       BEGIN
             SELECT ProductID, ProductName, Description, UnitPrice, ImagePath
             FROM dbo.Products where
             (@productName IS NULL or ProductName like '%'+ @productName +'%')
             AND
             (@startPrice IS NULL or UnitPrice > @startPrice)
             AND
             (@endPrice IS NULL or UnitPrice < @endPrice)         
       END

Zorg ervoor dat modelvalidatie wordt uitgevoerd op web-API-methoden

Titel DETAILS
Onderdeel Web-API
SDL-fase Compilatie
Toepasselijke technologieën MVC5, MVC6
Kenmerken N.v.t.
Naslaginformatie Modelvalidatie in ASP.NET Web-API
Stappen Wanneer een client gegevens naar een web-API verzendt, is het verplicht om de gegevens te valideren voordat ze worden verwerkt. Voor ASP.NET Web-API's die modellen accepteren als invoer, gebruikt u gegevensaantekeningen op modellen om validatieregels in te stellen voor de eigenschappen van het model.

Opmerking

De volgende code laat hetzelfde zien:

using System.ComponentModel.DataAnnotations;

namespace MyApi.Models
{
    public class Product
    {
        public int Id { get; set; }
        [Required]
        [RegularExpression(@"^[a-zA-Z0-9]*$", ErrorMessage="Only alphanumeric characters are allowed.")]
        public string Name { get; set; }
        public decimal Price { get; set; }
        [Range(0, 999)]
        public double Weight { get; set; }
    }
}

Opmerking

In de actiemethode van de API-controllers moet de geldigheid van het model expliciet worden gecontroleerd, zoals hieronder wordt weergegeven:

namespace MyApi.Controllers
{
    public class ProductsController : ApiController
    {
        public HttpResponseMessage Post(Product product)
        {
            if (ModelState.IsValid)
            {
                // Do something with the product (not shown).

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
        }
    }
}

Invoervalidatie implementeren voor alle parameters van het tekenreekstype die worden geaccepteerd door web-API-methoden

Titel DETAILS
Onderdeel Web-API
SDL-fase Compilatie
Toepasselijke technologieën Algemeen, MVC 5, MVC 6
Kenmerken N.v.t.
Naslaginformatie Modelgegevens valideren in een MVC-toepassing, richtlijnen voor uw ASP.NET MVC-toepassingen
Stappen Voor methoden die alleen primitieve gegevenstypen accepteren en niet modellen als argument, moet de invoervalidatie met behulp van de reguliere expressie worden uitgevoerd. Hier moet Regex.IsMatch worden gebruikt met een geldig regex-patroon. Als de invoer niet overeenkomt met de opgegeven reguliere expressie, mag het besturingselement niet verder gaan en moet er een adequate waarschuwing over validatiefouten worden weergegeven.

Zorg ervoor dat parameters voor typebeveiliging worden gebruikt in de web-API voor gegevenstoegang

Titel DETAILS
Onderdeel Web-API
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie N.v.t.
Stappen

Als u de verzameling Parameters gebruikt, behandelt SQL de invoer als een letterlijke waarde in plaats van als uitvoerbare code. De verzameling Parameters kan worden gebruikt om beperkingen voor type en lengte af te dwingen voor invoergegevens. Waarden buiten het bereik activeren een uitzondering. Als typeveilige SQL-parameters niet worden gebruikt, kunnen aanvallers mogelijk injectieaanvallen uitvoeren die zijn ingesloten in de niet-gefilterde invoer.

Gebruik veilige parameters van het type bij het maken van SQL-query's om mogelijke SQL-injectieaanvallen te voorkomen die kunnen optreden met niet-gefilterde invoer. U kunt typen veilige parameters gebruiken met opgeslagen procedures en met dynamische SQL-instructies. Parameters worden behandeld als letterlijke waarden door de database en niet als uitvoerbare code. Parameters worden ook gecontroleerd op type en lengte.

Opmerking

De volgende code laat zien hoe u veilige parameters van het type gebruikt met de SqlParameterCollection bij het aanroepen van een opgeslagen procedure.

using System.Data;
using System.Data.SqlClient;

using (SqlConnection connection = new SqlConnection(connectionString))
{ 
DataSet userDataset = new DataSet(); 
SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure", connection); 
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure; 
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11); 
myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text; 
myCommand.Fill(userDataset);
}  

In het voorgaande codevoorbeeld mag de invoerwaarde niet langer zijn dan 11 tekens. Als de gegevens niet voldoen aan het type of de lengte die is gedefinieerd door de parameter, genereert de sqlParameter-klasse een uitzondering.

Geparameteriseerde SQL-query's gebruiken voor Azure Cosmos DB

Titel DETAILS
Onderdeel Azure Document DB
SDL-fase Compilatie
Toepasselijke technologieën Algemeen
Kenmerken N.v.t.
Naslaginformatie Aankondiging van SQL-parameterisatie in Azure Cosmos DB
Stappen Hoewel Azure Cosmos DB alleen alleen-lezenquery's ondersteunt, is SQL-injectie nog steeds mogelijk als query's worden samengesteld door samen te voegen met gebruikersinvoer. Het is mogelijk dat een gebruiker toegang krijgt tot gegevens die ze niet mogen openen binnen dezelfde verzameling door schadelijke SQL-query's te maken. Gebruik geparameteriseerde SQL-query's als query's worden samengesteld op basis van gebruikersinvoer.

WCF-invoervalidatie via schemabinding

Titel DETAILS
Onderdeel WCF
SDL-fase Compilatie
Toepasselijke technologieën Algemeen, NET Framework 3
Kenmerken N.v.t.
Naslaginformatie MSDN
Stappen

Gebrek aan validatie leidt tot verschillende type injectieaanvallen.

Berichtvalidatie vertegenwoordigt één verdedigingslinie in de beveiliging van uw WCF-toepassing. Met deze methode valideert u berichten met behulp van schema's om WCF-servicebewerkingen te beveiligen tegen aanvallen door een kwaadwillende client. Valideer alle berichten die door de client zijn ontvangen om de client te beschermen tegen aanvallen door een kwaadwillende service. Met berichtvalidatie kunt u berichten valideren wanneer bewerkingen berichtcontracten of gegevenscontracten verbruiken. Dit kan niet worden gedaan met behulp van parametervalidatie. Met berichtvalidatie kunt u validatielogica in schema's maken, waardoor u meer flexibiliteit hebt en de ontwikkeltijd verkort. Schema's kunnen opnieuw worden gebruikt in verschillende toepassingen binnen de organisatie, waardoor standaarden voor gegevensweergave worden gemaakt. Bovendien kunt u met berichtvalidatie bewerkingen beveiligen wanneer ze complexere gegevenstypen gebruiken met contracten die bedrijfslogica vertegenwoordigen.

Als u berichtvalidatie wilt uitvoeren, maakt u eerst een schema dat de bewerkingen van uw service en de gegevenstypen vertegenwoordigt die door deze bewerkingen worden gebruikt. Vervolgens maakt u een .NET-klasse die een aangepaste clientberichtcontrole en aangepaste dispatcherberichtcontrole implementeert om de verzonden/ontvangen berichten naar/van de service te valideren. Vervolgens implementeert u een aangepast eindpuntgedrag om berichtvalidatie in te schakelen op zowel de client als de service. Ten slotte implementeert u een aangepast configuratie-element in de klasse waarmee u het uitgebreide aangepaste eindpuntgedrag kunt weergeven in het configuratiebestand van de service of de client"

WCF- Invoervalidatie via parametercontrole

Titel DETAILS
Onderdeel WCF
SDL-fase Compilatie
Toepasselijke technologieën Algemeen, NET Framework 3
Kenmerken N.v.t.
Naslaginformatie MSDN
Stappen

Invoer- en gegevensvalidatie vertegenwoordigt één belangrijke verdedigingslinie in de beveiliging van uw WCF-toepassing. U moet alle parameters valideren die beschikbaar zijn in WCF-servicebewerkingen om de service te beschermen tegen aanvallen door een kwaadwillende client. Omgekeerd moet u ook alle geretourneerde waarden valideren die door de client zijn ontvangen om de client te beschermen tegen aanvallen door een kwaadwillende service

WCF biedt verschillende uitbreidbaarheidspunten waarmee u het WCF-runtimegedrag kunt aanpassen door aangepaste extensies te maken. Message Inspectors en Parameter Inspectors zijn twee uitbreidbaarheidsmechanismen die worden gebruikt om meer controle te krijgen over de gegevens die worden doorgegeven tussen een client en een service. U moet parametercontrole gebruiken voor invoervalidatie en berichtencontrole alleen gebruiken wanneer u het hele bericht dat binnen en uit een service stroomt, moet controleren.

Als u invoervalidatie wilt uitvoeren, bouwt u een .NET-klasse en implementeert u een aangepaste parametercontrole om parameters voor bewerkingen in uw service te valideren. Vervolgens implementeert u een aangepast eindpuntgedrag om validatie in te schakelen op zowel de client als de service. Ten slotte implementeert u een aangepast configuratie-element in de klasse waarmee u het uitgebreide aangepaste eindpuntgedrag kunt weergeven in het configuratiebestand van de service of de client