File size: 3,081 Bytes
9eb915e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
"""
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', # Kreditkartennummern
r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', # E-Mail-Adressen
r'\b(?:\+\d{1,3}[ -]?)?(?:\(?\d{2,4}\)?[ -]?)?[\d -]{7,10}\b', # Telefonnummern
r'\bhf_\w+\b', # HuggingFace API-Tokens
r'\bsk-\w+\b' # OpenAI API-Tokens
]
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
# Ersetzen sensibler Muster
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
"""
# Konvertieren der Antwort in einen String für die Überprüfung
if not isinstance(response, str):
try:
response_str = str(response)
except:
return False
else:
response_str = response
# Überprüfen auf sensible Informationen
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
"""
# HuggingFace-Tokens beginnen mit "hf_"
if token.startswith("hf_") and len(token) > 10:
return True
return False
|