gateway/docs/real-estate-feature-integration-guide/10-security.md

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:

  1. Query-Whitelisting: Nur erlaubte Queries zulassen
  2. Nur SELECT: Nur SELECT-Statements erlauben (keine INSERT/UPDATE/DELETE)
  3. Parameterized Queries: Immer Parameterized Queries verwenden
  4. Query-Parsing: SQL-Parser verwenden zur Validierung
  5. 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

← Zurück: Datenbank-Schema | Weiter: Testing →