Context bewuste beveiliging van je MVC app
383

Dit artikel beschrijft een patroon welke onlangs door is toegepast. Het is van toepassing in de volgende scenario’s:

1. De web app moet controleren of een geautoriseerde gebruiker toegang heeft tot een entiteit in het systeem. In dit scenario heeft de applicatie de gebruiker toegang verleend. De noodzaak bestaat echter dat deze gebruiker toegang (lees: lezen en schrijven) heeft tot een beperkte populatie van gegevens. Bijvoorbeeld een systeem waarin informatie van apparaten beschikbaar wordt gesteld aan klanten van de leverancier. Echter, klanten hebben alleen toegang tot apparaten die zij zelf hebben aangeschaft.

mvc_klein2. De app moet controleren of de route parameters valide zijn. Door middel van het aanpassen van de URL in de adresbalk van de browser (“URL tampering”) ontstaat het risico dat de app wordt blootgesteld aan ongewenste verzoeken.

Om bovenstaande scenario’s te kunnen ondersteunen moet worden ingegrepen in de HttpRequest-keten van de browser naar de webserver. Binnen het ASP.Net MVC framework bestaan verschillende manieren om in te grijpen in de HttpRequest-keten, bijvoorbeeld:

3. ActionFilters en ActionAttributes; deze worden aangeroepen voorafgaand of na afloop na een controller action. Het framework doorzoekt de gekozen route (controller + actie + parameters) en bepaalt of er actionfilters zijn toegepast
4. ExceptionFilters; dit zijn speciale attributen die alleen worden aangeroepen bij het niet afhandelen van onverwachte fouten tijdens het doorlopen van een controller action

mvc2

Er is in de case gebruik gemaakt van ActionFilters. De RouteValidatorBaseAttribute is een base klasse. Deze heeft een abstract methode Validate die door afgeleide klassen moet worden geïmplementeerd. Een voorbeeld hiervan is de GuidValidatorAttribute. Deze attribute is de oplossing van scenario 2.
Voor scenario 1 is een attribuut als InstrumentAccessValidatorAttribute gebruikt. Deze controleert of de gebruiker de gevraagde apparaat mag opvragen.

In de constructor van de attributen worden de parameters doorgegeven die de validatie nodig heeft. De validatie wordt uitgevoerd door de Validate methode. Bij een invalide resultaat wordt de ErrorRedirect aangeroepen met de contextuele informatie over de validatie fout. De ErrorRedirect delegeert de request naar een pagina die de gebruiker informatie geeft over de validatie fout.