|
""" |
|
utils/security.py - Sicherheitsmodul für den Dr. Franz Psychochatbot |
|
|
|
Dieses Modul verwaltet die Sicherheitsaspekte des Chatbots: |
|
- Sichere Verwaltung von API-Tokens |
|
- Laden von Umgebungsvariablen |
|
- Schutz sensibler Daten |
|
""" |
|
|
|
import os |
|
import re |
|
from typing import Optional, Dict, Any |
|
|
|
class Security: |
|
"""Klasse zur Verwaltung der Sicherheitsaspekte""" |
|
|
|
def __init__(self): |
|
"""Initialisiert die Sicherheitskomponente""" |
|
self.sensitive_patterns = [ |
|
r'\b(?:\d[ -]*?){13,16}\b', |
|
r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', |
|
r'\b(?:\+\d{1,3}[ -]?)?(?:\(?\d{2,4}\)?[ -]?)?[\d -]{7,10}\b', |
|
r'\bhf_\w+\b', |
|
r'\bsk-\w+\b' |
|
] |
|
|
|
def get_api_token(self, env_var_name: str = "HF_API_TOKEN", default: str = "") -> str: |
|
""" |
|
Holt den API-Token aus den Umgebungsvariablen |
|
|
|
Args: |
|
env_var_name: Name der Umgebungsvariable |
|
default: Standardwert, falls die Variable nicht existiert |
|
|
|
Returns: |
|
Der API-Token oder der Standardwert |
|
""" |
|
return os.environ.get(env_var_name, default) |
|
|
|
def sanitize_user_input(self, text: str) -> str: |
|
""" |
|
Entfernt potenziell sensible Informationen aus der Nutzereingabe |
|
|
|
Args: |
|
text: Die zu bereinigende Nutzereingabe |
|
|
|
Returns: |
|
Die bereinigte Nutzereingabe |
|
""" |
|
sanitized_text = text |
|
|
|
|
|
for pattern in self.sensitive_patterns: |
|
sanitized_text = re.sub(pattern, "[ENTFERNT]", sanitized_text) |
|
|
|
return sanitized_text |
|
|
|
def validate_api_response(self, response: Any) -> bool: |
|
""" |
|
Überprüft, ob eine API-Antwort sicher ist |
|
|
|
Args: |
|
response: Die zu überprüfende API-Antwort |
|
|
|
Returns: |
|
True, wenn die Antwort sicher ist, sonst False |
|
""" |
|
|
|
if not isinstance(response, str): |
|
try: |
|
response_str = str(response) |
|
except: |
|
return False |
|
else: |
|
response_str = response |
|
|
|
|
|
for pattern in self.sensitive_patterns: |
|
if re.search(pattern, response_str): |
|
return False |
|
|
|
return True |
|
|
|
def is_valid_api_token(self, token: str) -> bool: |
|
""" |
|
Überprüft, ob ein API-Token gültig erscheint |
|
|
|
Args: |
|
token: Der zu überprüfende API-Token |
|
|
|
Returns: |
|
True, wenn der Token gültig erscheint, sonst False |
|
""" |
|
|
|
if token.startswith("hf_") and len(token) > 10: |
|
return True |
|
return False |
|
|