Beveiligingsframe: Invoervalidatie | Oplossingen
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 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:
|
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:
|
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 |
|
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:
|
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 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.
De pagina-in de verwijzingen schakelt ASP.NET aanvraagvalidatie uit door de instelling in te stellen 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 innerText
in 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:
|
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 |