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.