SQL-Injection-Prävention

Mehrschichtiger Schutz gegen SQL-Injection durch Whitelist-Durchsetzung, Parametrisierung und Mustererkennung.

Drei Schutzebenen

Signando Postgres verwendet mehrere Verteidigungsmechanismen gegen SQL-Injection:

┌─────────────────────────────────────────────────────────┐
│  Ebene 1: Query-Whitelist (Fingerprint-Matching)        │
│  ↓ Nur whitelisted Query-Templates passieren            │
├─────────────────────────────────────────────────────────┤
│  Ebene 2: Parametrisierungs-Durchsetzung                │
│  ↓ Keine Inline-Literale erlaubt, nur $1, $2...         │
├─────────────────────────────────────────────────────────┤
│  Ebene 3: Mustererkennung                               │
│  ↓ Bekannte Angriffsmuster blockiert                    │
└─────────────────────────────────────────────────────────┘

Konfiguration

# policy.yaml
sql_injection:
  # Parametrisierte Abfragen erzwingen
  enforce_parameterization: true

  # Bekannte Angriffsmuster blockieren
  block_patterns:
    - "OR '1'='1'"
    - "UNION SELECT"
    - "; DROP"
    - "-- "
    - "/*"

  # Max. Abfragelänge gegen Buffer-Overflow-Versuche
  max_query_length: 4096
SQLI-001BLOCKED

Klassische SQL-Injection - Blockiert

Angriffsversuch

SELECT * FROM users WHERE id = '1' OR '1'='1'

Erwartete Antwort

ERROR: SQL-Injection-Muster erkannt
DETAIL: Inline-Literalwerte sind nicht erlaubt. Verwenden Sie parametrisierte Abfragen.
HINT: Ändern zu: SELECT * FROM users WHERE id = $1

Der Tautologie-Angriff OR '1'='1' wird sowohl durch Mustererkennung als auch durch Parametrisierungs-Durchsetzung blockiert.

SQLI-002BLOCKED

UNION-basierte Injection - Blockiert

Angriffsversuch

SELECT id, name FROM users WHERE id = 1 UNION SELECT username, password FROM admin_users

Erwartete Antwort

ERROR: Query nicht in Whitelist
DETAIL: Query-Fingerprint entspricht keinem erlaubten Template.
       UNION SELECT-Muster erkannt und blockiert.

UNION-basierte Datenexfiltration wird blockiert, da die Abfragestruktur vom Whitelist-Template abweicht.

SQLI-003BLOCKED

Gestapelte Abfragen - Blockiert

Angriffsversuch

SELECT * FROM users WHERE id = 1; DROP TABLE users; --

Erwartete Antwort

ERROR: Mehrere Statements nicht erlaubt
DETAIL: Nur Einzel-Statement-Abfragen sind erlaubt.
       2 Statements durch ';' getrennt erkannt

Destruktive gestapelte Abfragen wie DROP TABLE werden blockiert. Nur Einzel-Statement-Abfragen, die der Whitelist entsprechen, passieren.

SQLI-004BLOCKED

Kommentar-basierte Injection - Blockiert

Angriffsversuch

SELECT * FROM users WHERE name = 'admin'--' AND password = 'x'

Kommentar-basierte Umgehungsversuche, die die Abfrage abschneiden wollen, werden durch Mustererkennung blockiert.

SQLI-VALIDERLAUBT

Korrekte parametrisierte Abfrage

Sichere Abfrage

SELECT id, name, email FROM users WHERE id = $1

Mit Parameter

Parameter $1 = 42  (separat gebunden, nie interpoliert)

Korrekt parametrisierte Abfragen sind sicher. Der Parameterwert wird separat gebunden und nie in den SQL-String interpoliert.