Analisi di un sito web per verificare se è GDPR compliant

Analisi di un sito web per verificare se è GDPR compliant

In qualità di consulente informatico, di recente mi è stato affidato l’incarico di condurre un audit GDPR su un sito di e-commerce, con l’obiettivo specifico di verificare la corretta gestione dei cookie. Nonostante l’apparente semplicità iniziale, ho intrapreso l’analisi sfruttando gli strumenti avanzati per sviluppatori integrati nei browser più diffusi.

Sin da subito è stato evidente che i browser comunemente utilizzati filtrano in modo consistente il comportamento dei server e dei siti web. Questa caratteristica, sebbene progettata per migliorare l’esperienza utente, rende estremamente difficile rilevare e analizzare il reale comportamento dei siti web relativamente ai cookie.

Pertanto, è sorta la necessità di uno strumento più preciso e trasparente, e ho deciso di sviluppare un browser personalizzato chiamato CookiesInspector. L’obiettivo principale era creare un’applicazione che non filtrasse alcuna informazione e consentisse di visualizzare in tempo reale quali e quanti cookie venissero somministrati al browser durante la navigazione, dalla sua apertura fino all’accettazione o al rifiuto dei cookie.

Per implementare il browser, ho scelto Python, utilizzando il framework PyQt6 per l’interfaccia grafica e QWebEngineView per il rendering delle pagine web. Durante lo sviluppo, la cura dell’interfaccia grafica non è stata una priorità; ciò che ho considerato essenziale era garantire la visibilità del comportamento del sito web durante la renderizzazione della pagina.

Nel realizzare questo browser, ho seguito una serie di fasi organizzate come segue:

  1. Inizio della Sessione di Tracciamento: Quando l’utente avvia la navigazione, viene estratto il dominio dall’URL inserito e creata una nuova cartella per la sessione. Da quel momento, inizia il tracciamento dei cookie mentre viene caricata la pagina web.
  2. Monitoraggio dei Cookie: Durante la navigazione, ogni volta che un cookie viene aggiunto o modificato, vengono registrati i dettagli del cookie (nome, valore, dominio, ecc.). Questi dati sono salvati in un file JSON, mentre gli hash vengono calcolati per identificare eventuali modifiche o nuovi cookie. Inoltre, viene aggiornato un file di riepilogo con i dettagli del cookie e l’evento corrispondente.
  3. Tracciamento dei Click del Mouse: Durante il caricamento della pagina, viene iniettato del codice JavaScript per registrare i click del mouse. Ogni click rilevato viene registrato nel file di riepilogo con i dettagli dell’evento.
  4. Monitoraggio del Local Storage: CookiesInspector ora tiene traccia anche delle modifiche al local storage del browser, fornendo una visione più completa delle tecniche di memorizzazione dei dati utilizzate dai siti web.
  5. Interruzione del Tracciamento: Quando l’utente decide di fermare il tracciamento, il sistema smette di monitorare i cookie e i click del mouse. Inoltre, il pulsante per visualizzare il riepilogo diventa disponibile.
  6. Raccolta di Metadati Aggiuntivi: Al termine della sessione, CookiesInspector raccoglie automaticamente informazioni aggiuntive come i dati WHOIS del dominio, il contenuto del file robots.txt e la sitemap del sito, se disponibili.
  7. Visualizzazione del Riepilogo: Quando richiesto, viene aperta una finestra dedicata che consente all’utente di visualizzare un riepilogo della sessione, mostrando una serie di metriche chiave.
  8. Analisi delle Metriche: Le metriche estratte dal file di riepilogo includono statistiche sui cookie (come il numero totale di tentativi di impostazione, cookie unici, ecc.), il tempo totale della sessione e altri dati rilevanti, che vengono poi categorizzati.
  9. Categorizzazione Avanzata dei Cookie: CookiesInspector classifica automaticamente i cookie in categorie più dettagliate, utilizzando un approccio euristico basato sul nome del cookie, il suo dominio e il suo valore.
  10. Presentazione delle Metriche: Le metriche calcolate vengono presentate all’utente in un formato organizzato, con una chiara distinzione tra statistiche generali, statistiche temporali e tipi di aggiornamenti dei cookie.
  11. Tabella degli Eventi: Viene mostrata una tabella dettagliata che elenca cronologicamente ogni evento registrato durante la sessione, permettendo all’utente di seguire il flusso delle attività.
  12. Dettagli degli Eventi Specifici: Cliccando su un evento nella tabella, l’utente può accedere a una finestra di dettaglio che fornisce informazioni approfondite su quell’evento specifico, compresi i dettagli completi del file JSON del cookie, se disponibili.
  13. Analisi delle Modifiche dei Cookie: Una nuova funzionalità permette di visualizzare un’analisi dettagliata delle modifiche apportate ai cookie nel corso del tempo, evidenziando nuovi cookie, cookie rimossi e cookie modificati.
  14. Visualizzazione del Local Storage: È stata aggiunta una funzione per visualizzare e analizzare le modifiche al local storage durante la sessione di navigazione.
  15. Esportazione dei Dati: CookiesInspector ora offre la possibilità di esportare le statistiche e i dati della tabella in formati facilmente leggibili per ulteriori analisi.

Il processo di classificazione del cookie è stato effettuato dapprima valutando se il cookie appartiene al sito analizzato o è di terze parti, successivamente l’algoritmo valuta i cookie secondo un approccio euristico basandosi sui seguenti array:

session_keywords = [
    'session', 'csrf', 'security', 'auth', 'sessione', 'sicurezza', 'autenticazione',
    'login', 'logon', 'access', 'token', 'phpessid', 'sid', 'sso', 'auth_token',
    'incap_ses', 'visid_incap', 'ApplicationGatewayAffinity', 'WFESessionId',
    '_twitter_sess', 'remember_me', 'lsession', 'PMAppHttp',
    'sess', 'pses'
]

analytics_keywords = [
    'analytics', 'stats', '_ga', '_gid', 'utm_', 'statistiche', 'analisi', 'stat',
    'metric', 'track', 'visitor', 'pageview', 'click', 'event', 'performance',
    'bounce', 'conversion', 'goal', 'sessionid', 'site_speed', 'AMCV_', 'AMCVS_',
    'gpv', 's_cc', 's_fid', 's_nr', 's_ppv', 's_sq', 's_vi', '_uetsid', '_uetvid',
    'ai_session', 'ai_user', '_fbp', '_gat', '_gaexp', 'mp_', 'et_', 'etracker',
    'icu'
]

functionality_keywords = [
    'preference', 'language', 'timezone', 'theme', 'preferenza', 'lingua', 'fuso_orario',
    'tema', 'locale', 'custom', 'setting', 'layout', 'display', 'view', 'accessibility',
    'user_pref', 'contrast', 'font', 'color', 'fontsize', 'mbox', 'lang', 'OptanonConsent',
    'CONSENT', 'wd', 'c_user',
    'Receive-Cookie-Deprecation'
]

profiling_keywords = [
    'ad', 'ads', 'track', 'targeting', 'remarketing', 'visitor', 'profile', 'profilazione',
    'pubblicità', 'tracciamento', 'profilo', 'visitatore', 'behavior', 'interest', 'social',
    'pixel', 'retargeting', 'campaign', 'conversion', 'affiliate', 'partner', 'marketing',
    'advert', 'demographics', 'demografia', 'brand', 'tracker', 'segment', 'audience', 'banner',
    'media', 'cta', 'clickthrough', 'lead', 'sale', 'roi', 'demdex', 'dextp', 'dpm', 'IDE',
    'fr', 'sb', 'spin', 'xs', 'datr', 'everest_', '_gac_', 'UserMatchHistory', 'li_sugr',
    'BizographicsOptOut', '_guid', 'li-oatml', 'ELOQUA', 'ELQSTATUS', 'pm_cid', 'uid', 'ufbid',
    'personalization_id', 'guest_id', 'kdt', 'twid', 'GPS', 'VISITOR_INFO1_LIVE',
    'uuid2', 'uids', 'anj', 'usersync', 'XANDR_PANID'
]

La logica di classificazione è definita nel seguente modo:

def classify_cookie(cookie_data, analyzed_domain):
    cookie_name = cookie_data.get('name', '').lower()
    cookie_domain = cookie_data.get('domain', '')
    cookie_value = cookie_data.get('value', '')

    is_first_party = is_first_party_cookie(cookie_domain, analyzed_domain)
    domain_type = "First Party" if is_first_party else "Third Party"

    if any(keyword in cookie_name for keyword in session_keywords):
        category = "Technical"
        technical_type = "Session"
    elif any(keyword in cookie_name for keyword in analytics_keywords):
        category = "Technical"
        technical_type = "Analytics"
    elif any(keyword in cookie_name for keyword in functionality_keywords):
        category = "Technical"
        technical_type = "Functionality"
    elif any(keyword in cookie_name for keyword in profiling_keywords) or len(cookie_value) > 50:
        category = "Profiling"
        technical_type = "N/A"
    else:
        category = "Other"
        technical_type = "N/A"

    return domain_type, category, technical_type

Questa classificazione euristica permette a CookiesInspector di fornire un’analisi dettagliata e significativa dei cookie utilizzati da un sito web, evidenziando potenziali problemi di conformità GDPR. È importante notare che, mentre questo approccio è molto efficace per la maggior parte dei cookie comuni, potrebbe non essere perfetto per ogni singolo caso.

Dopo numerosi test e la risoluzione di vari bug, CookiesInspector ha raggiunto un corretto funzionamento rispetto allo scopo previsto, consentendomi di avviare le verifiche con il committente. Durante i test, ho ampliato la gamma di siti web da analizzare per valutare l’affidabilità dello strumento e identificare eventuali bug. È emerso chiaramente che molti siti web, inclusi portali di notizie di alto profilo come corriere.it, ignorano completamente le disposizioni del GDPR, impostando cookie senza il consenso esplicito dell’utente ancor prima di richiedere formalmente l’accettazione o il rifiuto della policy, già nel momento in cui mostrano il cookie wall.

L’analisi del comportamento di corriere.it ha rivelato i seguenti risultati:

In caso di accettazione dei cookie:

  • Prima del click sul pulsante di accettazione, sono stati effettuati 130 tentativi di somministrazione di cookie.
  • Dopo l’accettazione della cookie policy, in soli 36,19 secondi, il portale ha somministrato 235 cookie unici.
  • Sono state registrate 801 modifiche totali ai cookie, di cui 550 modifiche effettive.
  • Il tempo trascorso fino al primo click è stato di 13,97 secondi.
  • Dei cookie impostati, 100 sono del corriere.it e 135 di terze parte.
  • Per quanto riguarda le categorie, sono stati identificati 17 cookie tecnici (14 analytics, 2 di funzionalità, 1 di sessione), 87 cookie di profilazione e 131 di altra natura.
Analisi dei cookie somministrati dal corriere.it in caso di accettazione

Prima del click che accetta la policy dei cookie, corriere.it ha somministrato 11 cookie di terze parti aventi domini:

  1. imrworldwide.com (The Nielsen Company: una delle principali società di misurazione di dati e marketing)
  2. demdex.net (Adobe: data management platform)
  3. piano.io (titolare del dominio sconosciuto “REDACTED FOR PRIVACY”: analytics)
  4. exelator.com (sempre della Nielsen Company)
  5. cxense.com (titolare del dominio sconosciuto “Identity Protection Service”)
  6. tinypass.com (titolare del dominio sconosciuto “Registration Private”)

In caso di rifiuto dei cookie:

  • Prima della comparsa del cookie wall, sono stati effettuati 130 tentativi di impostazione di cookie.
  • Nonostante il rifiuto, sono stati comunque somministrati 84 cookie unici in 13,33 secondi.
  • Sono state registrate 231 modifiche totali ai cookie, di cui 146 modifiche effettive.
  • Il tempo trascorso fino al primo click è stato di 9,20 secondi.
  • Dei cookie impostati, 68 sono di prima parte e 16 di terza parte.
  • Per quanto riguarda le categorie, sono stati identificati 15 cookie tecnici (13 analytics, 2 di funzionalità), 26 cookie di profilazione e 43 di altra natura.
Risultati in caso di rifiuto della policy cookie

Prima del click che rifiuta la policy dei cookie, corriere.it ha somministrato 11 cookie di terze parti aventi i seguenti domini demdex.net, imrworldwide.com, piano.io, exelator.com, cxense.com, tinypass.com ai quali se aggiunge il dominio tncid.app intestato ad una società italiana che si occupa di marketing.

Dopo il click che rifiuta la policy, oltre a cookies di profilazione aventi dominio corriere.it sono stati somministrati cookie con domini:

  1. doubleclick.net (titolare Google LLC)
  2. amazon-adssystem.com (dominio che nel momento in cui scrivo risulta disponibile su whois.com
  3. quantserve.com (titolare Quantcast che è un advertiser)

Questi dati evidenziano, presumibilmente, una violazione delle norme GDPR, in quanto vengono impostati numerosi cookie, inclusi quelli di profilazione, prima dell’espressione del consenso da parte dell’utente. Inoltre, anche in caso di rifiuto esplicito, il sito continua a impostare un numero significativo di cookie, inclusi quelli di profilazione.

Al che mi pongo una domanda: perché qualcuno, da qualche parte nel mondo, deve conoscere quali notizie e quante volte il mio ip o il mio browser legge le notizie?

Inoltre dall’analisi del file local_storage_changes.json, possiamo osservare che contiene informazioni sulle modifiche al local storage del browser durante la navigazione sul sito corriere.it. Ecco le informazioni trattate e gestite:

  1. Timestamp: Ogni entry è preceduta da un timestamp che indica quando è avvenuta la modifica nel local storage.
  2. Gestione del consenso:
    • “permutive-consent”: Gestisce lo stato del consenso dell’utente, probabilmente per la personalizzazione dei contenuti.
    • “rcs_permutive_consent”: Altro indicatore relativo al consenso dell’utente.
  3. Tracciamento e analisi:
    • “apw_browser”: Sembra essere un identificatore univoco del browser.
    • “dmpue_m_ueseg”: Potrebbe essere correlato a segmenti di utenti per scopi di targeting.
    • “_cX_lastP1Time”: Potrebbe tracciare l’ultima interazione dell’utente.
    • “__tsCP”: Probabilmente un timestamp per scopi di tracciamento.
  4. Gestione video:
    • “logger_Video-Manager”: Registra lo stato del gestore video, in questo caso impostato su “error”.
  5. Integrazione con servizi Google:
    • “subscribe.google.com:USER_TOKEN”: Token per l’integrazione con i servizi di abbonamento di Google.
  6. Informazioni sul browser e dispositivo:
    • “user-agent-data”: Contiene dettagli sul browser dell’utente, inclusi marca, versione, piattaforma e sistema operativo.
  7. Pubblicità e targeting:
    • “_cX_atfr”: Contiene vari parametri probabilmente utilizzati per il targeting pubblicitario.
  8. Link a contenuti specifici:
    • “link-millionday” e “link-superenalotto”: Collegamenti a pagine specifiche del sito, probabilmente per facilitare l’accesso rapido a contenuti popolari.
  9. Versioni SDK:
    • “lucidsdkver”: Versione di un SDK utilizzato, probabilmente per funzionalità specifiche del sito.
  10. Gestione degli account Google Analytics:
    • “__tp-gaAccount”: Stato dell’account Google Analytics, in questo caso “disabled”.
  11. Gestione della cache e time-to-live:
    • “_ls_ttl”: Sembra gestire il time-to-live di alcune chiavi nel local storage.

Questa analisi rivela che il sito corriere.it utilizza il local storage per gestire una varietà di funzionalità, tra cui:

  • Tracciamento del consenso dell’utente
  • Personalizzazione dei contenuti
  • Analisi del comportamento dell’utente
  • Integrazione con servizi di terze parti (come Google)
  • Gestione della pubblicità e del targeting
  • Ottimizzazione delle prestazioni del sito
  • Memorizzazione di informazioni sul dispositivo e browser dell’utente

È importante notare che molte di queste informazioni potrebbero essere considerate dati personali secondo il GDPR, e che il loro trattamento dovrebbe essere soggetto al consenso esplicito dell’utente, in particolare per quanto riguarda il tracciamento e la pubblicità mirata.

In conclusione, l’analisi approfondita del panorama digitale italiano ha rivelato una realtà preoccupante. L’esame dettagliato del comportamento di siti web popolari ha messo in luce violazioni significative del GDPR, con l’imposizione di centinaia di cookie, molti dei quali di profilazione, prima e persino dopo il rifiuto esplicito del consenso da parte dell’utente. Questa indagine non solo ha permesso di quantificare e categorizzare con precisione l’uso dei cookie, ma ha anche evidenziato l’esteso utilizzo del local storage per tracciare il comportamento degli utenti. Le implicazioni di queste pratiche sollevano serie preoccupazioni sulla privacy online e sull’effettiva applicazione delle normative vigenti. L’utilizzo di strumenti di analisi avanzati si rivela essenziale per ricercatori, sviluppatori e autorità di regolamentazione, offrendo una visione trasparente e dettagliata delle pratiche di tracciamento online. Mentre il dibattito sulla privacy digitale continua, il monitoraggio e l’analisi approfondita di queste pratiche saranno cruciali per promuovere la conformità e proteggere i diritti degli utenti nell’ecosistema digitale in continua evoluzione.

Il software, compilato, è disponibile per il download dall’URL https://www.acquisizioniforensi.it/cookies-inspector soltanto per macOS.

I commenti sono chiusi.