2.7 KiB
2.7 KiB
Sicherheitshinweise
← Zurück: Datenbank-Schema | Weiter: Testing →
⚠️ WICHTIG: Query-Validierung
Die aktuelle Implementierung erlaubt die Ausführung von rohen SQL-Queries. Für Produktion sollten Sie:
- Query-Whitelisting: Nur erlaubte Queries zulassen
- Nur SELECT: Nur SELECT-Statements erlauben (keine INSERT/UPDATE/DELETE)
- Parameterized Queries: Immer Parameterized Queries verwenden
- Query-Parsing: SQL-Parser verwenden zur Validierung
- Rate Limiting: Strikte Rate Limits setzen (bereits implementiert)
Beispiel für Query-Validierung:
def validateQuery(queryText: str) -> bool:
"""
Validate that query is safe to execute.
Only allows SELECT statements on Real Estate data model tables.
"""
query_lower = queryText.strip().lower()
# Only allow SELECT statements
if not query_lower.startswith('select'):
return False
# Block dangerous keywords
dangerous_keywords = [
'drop', 'delete', 'insert', 'update', 'alter', 'create',
'truncate', 'grant', 'revoke', 'exec', 'execute', 'call'
]
for keyword in dangerous_keywords:
if keyword in query_lower:
return False
# Only allow queries on Real Estate data model tables
allowed_tables = [
'projekt', 'parzelle', 'dokument', 'kontext',
'geopolylinie', 'geopunkt', 'land', 'kanton', 'gemeinde'
]
# Check if query references allowed tables
# Simple check - in production, use SQL parser
query_contains_allowed_table = any(
f'from {table}' in query_lower or f'join {table}' in query_lower
for table in allowed_tables
)
if not query_contains_allowed_table:
# Allow queries that don't specify table explicitly (might be subqueries)
# But log for review
logger.warning(f"Query does not reference known Real Estate tables: {queryText[:100]}")
return True
Erweiterte Validierung mit SQL-Parser:
Für Produktion sollten Sie einen SQL-Parser verwenden:
from sqlparse import parse, tokens
def validateQueryAdvanced(queryText: str) -> bool:
"""Advanced query validation using SQL parser."""
try:
parsed = parse(queryText)[0]
# Check statement type
if parsed.get_type() != 'SELECT':
return False
# Extract table names and validate
# Implementation depends on SQL parser library
# ...
return True
except Exception as e:
logger.error(f"Query parsing failed: {e}")
return False