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