90 lines
2.7 KiB
Markdown
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)
|
|
|
|
|
|
|