Gå til indhold
atlas

Inputvalidering

At tjekke alle data, et program modtager, mod faste regler, før de bruges, og afvise alt, der ikke passer.

Kladde - dette opslag er endnu ikke gennemgået.

Formelt

En kontrol, hvor et program på serversiden tjekker alle data udefra - formularfelter, indsendte filer, API-kald - for forventet type, længde, format og værdiområde og hellere bruger en liste over det tilladte end en liste over det forbudte.

Forklaret enkelt

Som et posthus, der kun tager imod pakker i bestemte størrelser med en ordentlig adresse på og straks giver alt andet tilbage over disken.

I praksis

En kommunes selvbetjeningsformular til parkeringstilladelser godtager kun et postnummer, hvis det er præcis fire cifre; en forespørgsel med bogstaver eller tegn i feltet afvises, før den når databasen.

Hvorfor det betyder noget

De fleste angreb på software begynder med input, udvikleren ikke havde regnet med; et tjek ved døren stopper mange af dem tidligt, men det skal bakkes op af sikker håndtering længere inde.

Sådan kommer du i gang

De typiske trin i rækkefølge. Tilpas dem til jeres organisation.

  1. Kortlæg alle tillidsgrænser, hvor data kommer ind i applikationen, herunder formularfelter, query-parametre, headers, cookies, API-bodies, filer, beskeder fra køer og svar fra andre tjenester eller sprogmodeller.
  2. Skriv for hvert felt den tilladte type, længde, format og værdiområde ned, og saml reglerne i fælles validatorer eller en JSON Schema- eller OpenAPI-beskrivelse i stedet for at sprede dem ud i koden.
  3. Dekod og normalisér input, fx URL-dekodning og Unicode-normalisering, før det valideres, så kodede varianter ikke kan snige sig forbi tjekket.
  4. Validér på serveren ved grænsen, først syntaksen og derefter den forretningsmæssige betydning, og afvis input, der ikke passer, i stedet for at forsøge at rette det.
  5. Bind struktureret input til eksplicitte objekter, der afviser ukendte felter, og konfigurér XML-parsere med DTD'er og eksterne entiteter slået fra.
  6. Ved filupload skal I tjekke størrelse, en allowlist over filtyper og filens faktiske signatur, give hver fil et navn genereret af serveren og gemme den uden for webroden.
  7. Behold også forsvaret dér, hvor data bruges, med parameteriserede forespørgsler, kontekstafhængig output-encoding og sikre API'er.
  8. Log afvist input sikkert uden at sende det uescaped tilbage, og læg unit tests og fuzz tests af validatorerne ind i build-pipelinen.

Typiske faldgruber

  • Kun at validere i browseren, hvilket enhver HTTP-klient kan gå uden om.
  • At stole på denylists over kendte farlige strenge, som alternative encodings og tricks med store og små bogstaver kommer uden om.
  • At se validering som løsningen på SQL injection eller XSS i stedet for parameteriserede forespørgsler og output-encoding.
  • At skrive regulære udtryk med indlejrede kvantorer og uden længdegrænse, hvilket åbner for ReDoS.

Gode vejledninger

Teknisk uddybning

OWASP's Input Validation Cheat Sheet skelner mellem syntaktisk validering, der håndhæver en værdis korrekte form (et CPR-nummer er ti cifre, en dato kan parses som ISO 8601, et antal er et heltal), og semantisk validering, der håndhæver korrekthed i forretningskonteksten (en startdato ligger før slutdatoen, et antal er mellem 1 og 99, den konto, der henvises til, tilhører kalderen). Begge dele skal køre på serveren ved tillidsgrænsen, så tidligt som muligt, før data når forretningslogik eller lagring. Tjek i klienten forbedrer brugeroplevelsen, men giver ingen sikkerhed, fordi enhver HTTP-klient kan gå uden om dem. NIST SP 800-53 Rev. 5 beskriver samme kontrol som SI-10 Information Input Validation, og den tilsvarende svaghed er CWE-20 Improper Input Validation.

Allowlisting definerer, hvad der er acceptabelt, via en type, en opremsning af gyldige værdier, en længdegrænse, et talinterval eller et forankret regulært udtryk, og afviser alt andet. Denylisting af kendte farlige strenge som script-tags eller SQL-nøgleord er skrøbeligt: angribere omgår det med alternative encodings, skift mellem store og små bogstaver, kommentarer og Unicode-tegn, der ligner andre tegn. Input skal dekodes og kanoniseres (URL-dekodning, Unicode-normalisering som NFC eller NFKC, opløsning af stier), før det valideres, ellers kan et tjek for "../" omgås med %2e%2e%2f eller overlange encodings. Regulære udtryk kan selv blive en vej til denial of service: mønstre med indlejrede kvantorer kan backtracke katastrofalt på udformet input (ReDoS), så længdegrænser skal anvendes først.

Struktureret input valideres bedst mod et skema: JSON Schema eller OpenAPI for API-bodies, XSD for XML med DTD'er og eksterne entiteter slået fra for at undgå XXE, og streng binding til eksplicitte dataoverførselsobjekter, så ekstra felter afvises, hvilket også forhindrer mass assignment. Filuploads kræver en størrelsesgrænse, en allowlist over filtyper, der tjekkes sammen med filens faktiske signatur frem for den Content-Type, klienten oplyser, filnavne genereret af serveren og lagring uden for webroden.

Den vigtigste begrænsning er, at validering ikke erstatter håndtering tilpasset den kontekst, data bruges i. En streng kan være fuldt gyldig, fx efternavnet O'Neil eller en fritekstkommentar med vinkelparenteser, og alligevel være farlig i en SQL-sætning eller på en HTML-side. Injection forhindres dér, hvor data bruges, med parameteriserede forespørgsler, kontekstafhængig output-encoding og sikre API'er; validering gør angrebsfladen mindre og fanger fejlformede data tidligt. Det samme gælder data fra interne tjenester, databaser og output fra sprogmodeller, som skal behandles som ubetroede, når de stammer fra noget uden for komponentens egen kontrol.

Relationer

Kilder og videre læsning

Standarder og officielle tekster

  • NIST SP 800-53 Rev. 5 - SI-10 Information Input Validation · NIST

Hvor dataene kommer fra

Dette opslag er skrevet af en AI ud fra kilderne ovenfor og er endnu ikke gennemgået af et menneske. Brug det som udgangspunkt, og tjek alt vigtigt mod kilderne.

Se gennemgangskøenForeslå en rettelse på GitHubDette begreb som JSON

Nævnt i

Test dig selv

Indlæser…

Atlas er i beta.