Øvelse 23 – Opretholdelse af objekters integritet med invarians i webapplikationer
Source code
using System.Text.RegularExpressions;
namespace ValidateTheNameModelBinding.Models
{
public class Person
{
private string firstName;
private string lastName;
public Person(string firstName, string lastName)
{
isFirstNameValid(firstName);
isLastNameValid(lastName);
this.firstName = firstName;
this.lastName = lastName;
}
private void isFirstNameValid(string name)
{
///Add Invariance validation Here
/// Throw an Exception if the name is invalid
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name), $"{nameof(name)} må ikke være null eller tomt.");
if (name.Length > 20 || name.Length < 3) throw new ArgumentException($"{nameof(name)} skal være mellem 3 og 20 karaktere langt.", nameof(name));
Regex nameRegex = new Regex(@"^[A-Za-zÆØÅæøå]+$");
if (!nameRegex.IsMatch(name)) throw new ArgumentException($"{nameof(name)} må kun bestå af store og små bogstaver mellem a og å.", nameof(name));
}
private void isLastNameValid(string name)
{
///Add Invariance validation Here
/// Throw an Exception if the name is invalid
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name), $"{nameof(name)} må ikke være null eller tomt.");
if (name.Length > 20 || name.Length < 3) throw new ArgumentException($"{nameof(name)} skal være mellem 3 og 20 karaktere langt.", nameof(name));
Regex nameRegex = new Regex(@"^[A-Za-zÆØÅæøå]+$");
if (!nameRegex.IsMatch(name)) throw new ArgumentException($"{nameof(name)} må kun bestå af store og små bogstaver mellem a og å.", nameof(name));
}
}
}
Reflekterende spørgsmål
- Hvordan supplerer inputvalidering og håndhævelse af invarians hinanden i et forsvar-i-dybden (defense in depth) perspektiv?
Hvis validering af DTO'en (indkommende data) fejler, så skal håndhævelsen af invarians fange det ugyldige input, på den måde har man to lag af sikkerhed.
- Hvilke risici kan opstå, hvis man kun anvender invarians eller kun inputvalidering?
Ved kun at bruge inputvalidering kan man risikere at der oprettes ugyldige objekter direkte i programkoden. Hvis man kun bruger invarians kan man f.eks. risikere at modtage ugyldige data som så ved en fejl kunne ende inde i systemet.
- Hvordan kan gentagen validering (fx både i controller og i domænemodel) påvirke performance og kompleksitet?
Det gør at systemet skal vaildere det hele to gange og det koster selvføægelig performance. Kompleksiteten stiger selvfølgelig også da eventuelle ændringer til validering/invarians skal opdateres to steder.
- Under hvilke omstændigheder kunne det være hensigtsmæssigt at reducere valideringsniveauer for at optimere ydeevnen?
Lad os sige at der er tale om et internt system som kun kan tilgås af andre systemer/bruger man stoler på, så kan man måske droppe f.eks. den tungere regex validering på et af niveauerne.
- Hvordan kan man sikre, at valideringsregler forbliver konsistente mellem inputvalidering og invarians?
Reglerne skal skrives ned som del af sin domænemodellering. Alternativt kan man også oprette valideringsklasser som kan bruges begge steder. F.eks. en metode som retunerer true/false på om længden er korrekt, herefter kan man så f.eks. smide en exception i konstruktor og blot melde false tilbage i controller. Når længden man accepterer evt. skal ændre, så skal det kun gøre i den ene metode.
Kobling til standarder
| Element i øvelsen | Relateret standard / princip | Kommentar |
|---|---|---|
| Inputvalidering | ISO/IEC 27002:2022, afsnit 8.26 (applikationssikkerhed) | Anbefaler validering og integritetstjek af input til en applikation. |
| OWASP ASVS 5.0.0, kontrol 16.5 (Error Handling) | Krav om korrekt håndtering af fejl(undtagelser) | |
| Secure by Design (Johnsson et al.) | Fremhæver princippet om at skabe robuste domænemodeller og sikre objekters tilstand gennem konstruktion. |