Klientvalidering med asp.net

Genom att validera användarinmatningar får du en mer stabil och säker applikation. Värt att tänka på här är att även querystrings, ”hidden”-fält, referrer, user agent osv också måste räknas som användarinmatning. Du får även möjlighet att ge användaren bra upplysningar om vad som är missat / har gått fel.

När man pratar om validering finns det flera typer av valideringar som går att genomföra. De mest vanliga är troligtvis:

  • Datatyp
  • Längd
  • Tecken

När det gäller validering vid presentationsläget har .net många inbyggda kontroller som man kan använda.
RequiredFieldValidator kontrollerar så att en inmatningsruta inte är tom.

<asp :RequiredFieldValidator runat="server" 
controltovalidate="kontroll" errormessage="felmeddelande" 
display="&#91;Static|Dynamic&#93;" EnableClientScript="&#91;True|False&#93;" />

Controltovalidate
Här anger du vilken kontroll som skall kontrollers

Errormessage
Här anger du vilket felmeddelande som skall visas

Display
Static betyder att platsen för felmeddelandet är reserverad, medan dynamic betyder att den tar nödvändig plats först när felmeddelandet skall visas

Enableclientscript
True betyder att den utför valideringen på klientsidan och på serversidan (Page.IsValid måste dock användas).
False betyder att den utför valideringen på serversidan, du måste då kontrollera Page.IsValid. Vi visar detta närmre i ett exempel senare i artikeln.

Med RequiredFieldValidator är det längden vi kontrollerar, det är därför bra att komplettera den med exempelvis en datatypsvalidering.
I vårt exempel kontrollerar vi att inmatningen är av typen integer och att värdet är mellan 0 och 360.

<asp :RangeValidator runat="server" 
controltovalidate="kontroll" errormessage="Värdet måste vara mellan 0 och 360" 
Type="Integer" MinimumValue="0" MaximumValue="360" />

RangeValidator kan även kontrollera datatyperna string, integer, double, date och currency.

Redan nu har vi en god kontroll över vad som kommer att skickas in till vårt nästa lager och som vi kanske senare skall skicka vidare till databasen eller liknande, vilket minskar risken för sql-injection, xss och andra angrepp på servern.

Utöver de två kontroller vi har sett hittills så finns det även CompareValidator som används för att jämföra värdet av två kontroller (se nedan).

<asp :CompareValidator runat="Server" 
controltovalidate="kontroll" controltocompare="kontroll"
operator="Equal|NotEqual|GreaterThan|GreaterThanEqual|LessThan|LessThanEqual|DataTypeCheck"
type="String|Integer|Double|Date|Currency" errormessage="felmeddelande" />

Om du använder operatorn DataTypeCheck så används inte controltocompare, istället kontrollerar den det inmatade värdet för aktuell kontroll baserat på vilken datatyp du har valt. Se exemplet nedan som kontrollerar om inmatat värde är av typen datum.

<asp :CompareValidator runat="Server" 
controltovalidate="kontroll" operator="DataTypeCheck" 
type="Date" errormessage="felmeddelande" />

Vidare har vi RegularExpressionValidator där vi genom ett reguljärt uttryck kan validera värdet. Här finns nästan obegränsade möjligheter. Kan vara bra för att kontrollera exempelvis epostadress eller personnummer.
Nedan ser vi ett exempel där inmatningen minst måste innehålla 10 tecken och max 20 tecken. Notera dock att man även måste koppla på en requiredfieldvalidator på kontrollen eftersom regularexpressionvalidatorn bara körs om det är minst ett tecken inmatat.

<asp :RegularExpressionValidator runat="server" 
ControlToValidate="kontroll" ErrorMessage="Minst 6 tecken" 
ValidationExpression="(.){10,20}" />

Utöver de validatorer som vi har gått igenom finns även CustomValidator som kan användas i alla de sammanhang som någon av de andra fyra inte räcker till. I CustomValidator väljer du själv vad som skall passera och vad som skall tolkas som felaktigt. Med denna kan du kontrollera allt ifrån om ett datum är en måndag eller om en text är ett palindrom.

<asp :TextBox id="myDate" runat="server" />
<asp :CustomValidator id="CustomValidator1" runat="server" 
ErrorMessage="Inmatningen måste ske i formatet yymmdd" ControlToValidate="myDate" 
OnServerValidate="CustomValidator1_ServerValidate"/>

I vår kod så gör vi utför vi sedan kontrollen

void CustomValidator1_ServerValidate(object sender, ServerValidateEventArgs e)
{
    int i = int.Parse(e.Value);
    e.IsValid = ( (i%2) == 0 );
}

Det går utmärkt att utföra klientvalidering med customValidator också. Det gör du genom att skapa ett klientscript (javascript exempelvis) och sedan i din customvalidator ange ClientValidationFunction=”ClientValidate”.

<script language="javascript">
function ClientValidate(source, e)
{
   if ( (e.Value % 2) == 0 )
      e.IsValid=true;
   else
      e.IsValid=false;
}
</script>

Som jag tidigare nämnt så utförs servervalidering alltid vid postback, dock utförs klientvalidering endast när webbläsaren har stöd för detta. För att avgöra hur servervalideringen gick måste du kontrollera dess status och agera efter det. Detta innebär att du på varje event måste kontrollera status på Page.IsValid. Se exempel på ett knappevent nedan där användaren matat in data i ett formulär.

private void btnLogin_Click(object sender, System.EventArgs e)
{
	if (Page.IsValid)
	{
		//Nu är inmatade värden validerade.
		//Vi kan därför fortsätta med det vi skall göra.
	}
}

Som du ser behöver du bara kontrollera om Page.IsValid är sant eller inte. Är den inte sant så aktiveras dina felmeddelanden, om du inte utför denna kontrollen kommer den att utföra det som finns i knappeventet.

Läs gärna vidare om servervalidering som man också måste göra för att bygga en säker applikation.

3 kommentarer

  1. […] Asp.net, Säkerhet 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 […]

  2. […] som utvecklare? För 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 […]

  3. […] användarnamnssökning ä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 […]

RSS feed for comments on this post

Kommentarer inaktiverade.

%d bloggare gillar detta: