Servervalidering med asp.net och c#

Det finns valideringskontroller i asp.net som hanterar servervalidering och klientvalidering till viss del. Det finns dock flera tillfällen då dessa valideringskontroller inte är tillräckliga. Dessutom hanterar de bara presentationslagret. För att ett sytem skall bli säkert skall man skriva säker kod i alla lager och då är validering en del i säkerhetsarbetet.

Det första man bör tänka på är att använda rätt datatyp i metoder och inte generalisera.
Vi kan exempelvis tänka oss följande kod.

void SearchUser(string ageFrom, string ageTo)
{
    DoSearch(ageFrom, ageTo);
}

SearchUser(Request.QueryString["ageFrom"], Request.QueryString["ageTo"]);

I ovanstående kod ser vi att vi skickar in strängar i form av en ålder. Åldern kommer från Request.Querystring. Här bör vi byta ut string mot exempelvis int eller byte.
Vi bör sedan dessutom kontrollera att värdet från querystring innehåller ett tal.
Utöver det så kan vi tänka oss att gränssnittet gör det möjligt att välja en ålder mellan 18 och 100. Då bör vi även validera detta innan det skickas vidare.
Innan vi har refaktoriserat så skulle det kunna se ut såhär

void SearchUser(byte ageFrom, byte ageTo)
{
DoSearch(ageFrom, ageTo);
}

byte ageFrom, ageTo;
if (byte.TryParse(Request.QueryString[”ageFrom”], out ageFrom) && byte.TryParse(Request.QueryString[”ageFrom”], out ageTo))
{
if (ageFrom >= 18 && ageFrom < = 100 && ageTo >= 18 && ageTo < = 100) { SearchUser(ageFrom, ageTo); } } [/sourcecode] Även strängvärden bör kontrolleras i den mån som det är möjligt. Som exempel får vi indata i form av en sträng som representerar ett ipnummer. Det kan då kontrolleras exempelvis genom ett reguljärt uttryck, eller kanske ännu bättre tryparse-metoden i IPAddress-klassen. [sourcecode lang="csharp"]void SearchIp(string ip) { //Med reguljärt uttryck if (Regex.IsMatch(ip, "\\A(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b)\\z")){ } //Med tryparse IPAddress address; if (IPAddress.TryParse(ip, out address)){ } } [/sourcecode] Längden på strängar skall också kontrolleras. Detta eftersom det annars kan missbrukas vilket kan göra att applikationen utnyttjar för mycket minne och kraschar. [sourcecode lang="csharp"]void SendTwitterMessage(string message) { if (message.Length >= 1 && message.Length <= 140) { } }[/sourcecode]

3 kommentarer

  1. […] gärna vidare om servervalidering som man också måste göra för att bygga en säker […]

  2. […] det första, lita aldrig på att data som kommer från en webbläsare. Läs om klientvalidering och servervalidering som jag skrivit om. Skriv ut data som HTML-enkodat (använd Server.HtmlEncode()) även på ställen […]

  3. […] är 20, så skall man bara kunna skicka in 20 tecken. Det skall vara både klientvalidering och servervalidering. Rätt datatyper skall också valideras. Vi kan tänka oss en querystring där man skall mata in […]

RSS feed for comments on this post

Kommentarer inaktiverade.

%d bloggare gillar detta: