Säker kodning och OWASP Top 10 för backend · Lektion

Omfattande strategier för indatavalidering

Utveckla robusta rutiner för indatavalidering, inklusive vitlistning, kanonisering och strikt kontroll av datatyper, för att neutralisera olika indatabaserade attacker.

Lektion 2 av 411 steg

Omfattande strategier för indatavalidering är en gratis lektion i Säker kodning och OWASP Top 10 för backend på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Säker kodning och OWASP Top 10 för backend, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Säker kodning och OWASP Top 10 för backend innehåller totalt 4 lektioner.

Varför validera indata?

Indatavalidering är processen att säkerställa att data från en användare eller ett annat system följer förväntade format och begränsningar.

Det är den första och viktigaste försvarslinjen mot många typer av attacker, till exempel injektioner och buffertspill, samt mot enkla logiska fel.

Utgå alltid från att extern indata är skadlig tills motsatsen har bevisats!

Vitlistning för säkerhet

Vid validering av indata är det säkraste tillvägagångssättet vitlistning. Det innebär att ni uttryckligen definierar vad som är tillåtet och avvisar allt annat.

  • Vitlistning: "Endast dessa tecken/mönster är tillåtna."
  • Svartlistning: "Dessa tecken/mönster är förbjudna."

Svartlistning är riskabelt eftersom angripare ofta hittar sätt att kringgå förbjudna mönster. Vitlistning är proaktiv och betydligt säkrare.

Enkel vitlistningskontroll

Här är ett enkelt Java-exempel på vitlistning av tillåtna tecken för ett användarnamn. Endast bokstäver, siffror och understreck är tillåtna.

public class InputValidator {
  public static boolean isValidUsername(String username) {
    if (username == null || username.isEmpty()) {
      return false;
    }
    // Whitelist: only letters, numbers, and underscore
    return username.matches("^[a-zA-Z0-9_]+$");
  }

  public static void main(String[] args) {
    String user1 = "coddy_kit_123";
    String user2 = "bad user!";
    String user3 = "admin";

    System.out.println("User '" + user1 + "' is valid: " + isValidUsername(user1));
    System.out.println("User '" + user2 + "' is valid: " + isValidUsername(user2));
    System.out.println("User '" + user3 + "' is valid: " + isValidUsername(user3));
  }
}

Normalisera er indata

Kanonisering (eller normalisering) är processen att omvandla indata till en standardiserad, förenklad eller "kanonisk" form före validering.

Detta är avgörande eftersom angripare ofta försöker kringgå validering genom att koda indata på olika sätt (t.ex. %2F för /, & för &). Kanonisering säkerställer att alla varianter reduceras till en gemensam representation.

Kanonisering i praktiken

Det här Java-utdraget visar hur ni kan kanonisera en sökväg genom att avkoda URL-kodning och förenkla sökvägskomponenter (t.ex. ta bort /./ eller /../ om det är tillåtet, även om ../ vanligtvis bör blockeras).

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

public class PathCanonicalizer {
  public static String canonicalizePath(String path) {
    try {
      // 1. URL Decode the path
      String decodedPath = URLDecoder.decode(path, StandardCharsets.UTF_8.name());
      
      // 2. Normalize path separators (e.g., replace backslashes with forward slashes)
      decodedPath = decodedPath.replace("\\", "/");
      
      // 3. Remove redundant path elements (e.g., /./)
      decodedPath = decodedPath.replace("/./", "/");
      
      // Note: Full path traversal prevention requires more complex logic
      // and often involves resolving the path against a base directory.
      
      return decodedPath;
    } catch (Exception e) {
      return null; // Handle decoding errors
    }
  }

  public static void main(String[] args) {
    String input1 = "/usr/local/%2E%2E/etc/passwd";
    String input2 = "/app/data/./report.txt";

    System.out.println("Original: " + input1 + "\nCanonical: " + canonicalizePath(input1));
    System.out.println("\nOriginal: " + input2 + "\nCanonical: " + canonicalizePath(input2));
  }
}

Säkerställ datatyper

Utöver teckenuppsättningar är det viktigt att validera indatans datatyp. Om ni förväntar er ett heltal ska ni säkerställa att värdet är ett heltal. Om ni förväntar er ett booleskt värde ska ni säkerställa att det är true eller false.

Felaktiga datatyper kan leda till:

  • Programkrascher
  • Oväntat beteende
  • Säkerhetsbrister (t.ex. attacker genom typjonglering i vissa språk)

Exempel på typkontroll

Det här Java-exemplet visar hur en sträng kan tolkas som ett heltal på ett säkert sätt, samtidigt som möjliga NumberFormatException-undantag fångas.

public class DataTypeEnforcer {
  public static Integer parseIntegerSafely(String input) {
    if (input == null || input.trim().isEmpty()) {
      return null; // Or throw an IllegalArgumentException
    }
    try {
      return Integer.parseInt(input.trim());
    } catch (NumberFormatException e) {
      System.err.println("Error: '" + input + "' is not a valid integer.");
      return null; // Indicate failure
    }
  }

  public static void main(String[] args) {
    String validNum = "12345";
    String invalidNum = "abc";
    String negativeNum = "-50";

    System.out.println("Parsed '" + validNum + "': " + parseIntegerSafely(validNum));
    System.out.println("Parsed '" + invalidNum + "': " + parseIntegerSafely(invalidNum));
    System.out.println("Parsed '" + negativeNum + "': " + parseIntegerSafely(negativeNum));
  }
}

Begränsa och formatera

Indatavalidering omfattar även kontroll av datas längd och format:

  • Längdvalidering: Förhindra överdrivet lång indata som kan orsaka buffertspill eller överbelastningsattacker. Ange minimi- och maximilängder.
  • Formatvalidering: Använd reguljära uttryck (regex) för att säkerställa att indata följer specifika mönster, till exempel e-postadresser, telefonnummer eller UUID:er.

Kombinera detta med vitlistning för robusta kontroller.

Serversidan är avgörande

Kom ihåg att validering på klientsidan (i webbläsaren) endast är till för användarupplevelsen. Angripare kan enkelt kringgå den.

All kritisk indatavalidering måste ske på serversidan. Då förblir backend säker även om en skadlig användare kringgår kontrollerna på klientsidan.

Lita aldrig på indata från klienten!

Testa era kunskaper

Vilka av följande rekommenderas som bästa praxis för heltäckande indatavalidering?

Sammanfattning av validering

I den här lektionen har vi gått igenom strategier för heltäckande indatavalidering:

  • Använd alltid vitlistning för att definiera vad som är tillåtet.
  • Genomför kanonisering för att normalisera indata och motverka kodningsknep.
  • Säkerställ strikta datatyper för att förhindra oväntat beteende.
  • Validera längd och format med regex.
  • Det är avgörande att alltid utföra valideringen på serversidan.

Robust indatavalidering är en hörnsten i säker backend-utveckling!

Gratis att börja

Lär dig Säker kodning och OWASP Top 10 för backend med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
12
Lektioner
48

Vanliga frågor

Är lektionen ”Omfattande strategier för indatavalidering” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Säker kodning och OWASP Top 10 för backend, inklusive ”Omfattande strategier för indatavalidering”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Säker kodning och OWASP Top 10 för backend innehåller totalt 4 lektioner.

Vad lär jag mig i ”Omfattande strategier för indatavalidering”?

Utveckla robusta rutiner för indatavalidering, inklusive vitlistning, kanonisering och strikt kontroll av datatyper, för att neutralisera olika indatabaserade attacker. Ni övar på Säker kodning och OWASP Top 10 för backend med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Säker kodning och OWASP Top 10 för backend?

Du behöver inga förkunskaper. Utbildningen i Säker kodning och OWASP Top 10 för backend på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Omfattande strategier för indatavalidering”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Säker kodning och OWASP Top 10 för backend-lektionen?

Ja. Varje Säker kodning och OWASP Top 10 för backend-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Avancerade SQLi- och NoSQLi-tekniker
  2. Omfattande strategier för indatavalidering
  3. Content Security Policy (CSP) för backend
  4. Förhindra kommando- och LDAP-injektion
← Tillbaka till Säker kodning och OWASP Top 10 för backend