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

90 lines
2.7 KiB
Markdown

# Sicherheitshinweise
[← Zurück: Datenbank-Schema](09-database-schema.md) | [Weiter: Testing →](11-testing.md)
## ⚠️ 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:
```python
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:
```python
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](09-database-schema.md) | [Weiter: Testing →](11-testing.md)