IT
Accedi Pubblica
contextetech /

Salvaguardia GDPR: oscurare codice fiscale, telefono e IBAN

v1
Modello di destinazione : Generale (tutti i modelli) Italiano Licenza: MIT Pubblicato il aggiornato 15 ore fa 0 utilizzi

Salvaguardia GDPR che oscura codice fiscale (con controllo), telefoni +39, IBAN ed email personali nelle risposte di un assistente IA. 12 test.

Regole

Oscurare prima dell'invio qualsiasi dato che identifichi o renda contattabile una persona:
- indirizzi email personali (mario.rossi@…);
- numeri di telefono italiani, con o senza +39;
- IBAN italiani;
- codici fiscali (si verifica il carattere di controllo).
Lasciar passare: indirizzi generici (info@, assistenza@…), nomi di aziende, importi, date, numeri d'ordine.

Casi di test

InputAtteso
Può scrivere a mario.rossi@gmail.com per aggiornamenti.Bloccare
Il mio cellulare è 347 123 4567.Bloccare
Mi chiami al +39 06 1234 5678 domani.Bloccare
Bonifico su IT60 X054 2811 1010 0000 0123 456.Bloccare
Codice fiscale: RSSMRA85T10A562S.Bloccare
Fattura da inviare a giulia.bianchi@azienda.it.Bloccare
Scriva ad assistenza@contextetech.com per qualsiasi domanda.Consentire
Il suo ordine n. 458712 parte domani.Consentire
L'importo è di 1.250,00 € IVA inclusa.Consentire
Appuntamento il 12/10/2026 alle 14.Consentire
L'azienda Costruzioni Esposito S.r.l. ha accettato il preventivo.Consentire
Buongiorno, come posso aiutarla?Consentire

Codice

import re

SCHEMI = {
    "email": r"[\w.+-]+@[\w-]+\.[\w.-]+",
    "telefono": r"(?:\+39[\s.-]?)?\b(?:3\d{2}|0\d{1,3})[\s.-]?\d{3,4}[\s.-]?\d{3,4}\b",
    "iban": r"\bIT\d{2}\s?[A-Z]\d{3}(?:\s?[\dA-Z]{4}){5}\b",
    "codice_fiscale": r"\b[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]\b",
}
GENERICI = ("info@", "contatti@", "assistenza@", "supporto@", "ciao@")
DISPARI = dict(zip("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",
                   [1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23]))


def codice_fiscale_valido(cf: str) -> bool:
    """Il sedicesimo carattere è il carattere di controllo calcolato sui primi quindici."""
    cf = cf.upper()
    somma = sum(DISPARI[c] if i % 2 == 0 else (int(c) if c.isdigit() else ord(c) - 65) for i, c in enumerate(cf[:15]))
    return chr(65 + somma % 26) == cf[15]


def mascherare(testo: str) -> tuple[str, bool]:
    """Sostituisce i dati personali con [<tipo> oscurato]; restituisce il testo e True se qualcosa è stato oscurato."""
    trovato = False
    for tipo, schema in SCHEMI.items():
        def sostituire(m):
            nonlocal trovato
            valore = m.group(0)
            if tipo == "email" and valore.lower().startswith(GENERICI):
                return valore
            if tipo == "codice_fiscale" and not codice_fiscale_valido(valore):
                return valore
            trovato = True
            return f"[{tipo} oscurato]"
        testo = re.sub(schema, sostituire, testo)
    return testo, trovato

Community

Ancora nessun commento. Condividi la tua esperienza, aiuterà chi viene dopo.