Il GDPR non è solo un documento di 50 pagine da far firmare al cliente. È un insieme di obblighi tecnici che – se non implementati nel codice – ti esponi a sanzioni e, peggio, a fughe di dati. Lo vediamo ogni giorno nei progetti che ci arrivano: form che salvano in chiaro in database MySQL senza nessuna protezione, cookie senza consenso tracciato, log che espongono email e password hashate male. Non serve fare allarmismo, serve capire cosa deve fare uno sviluppatore per rendere un'applicazione conforme. Noi, di Meteora Web, lavoriamo con PMI da quasi 10 anni, e abbiamo imparato che la privacy non è un'opzione: è architettura.
Perché il GDPR riguarda il codice, non solo la privacy policy
Il Regolamento Generale sulla Protezione dei Dati (GDPR) ha impatti diretti su: database design, gestione delle sessioni, logging, crittografia, API, consenso, portabilità, cancellazione. Se pensi che basti aggiungere un banner cookie e una pagina “Privacy Policy”, il tuo cliente rischia. Noi abbiamo visto plugin WordPress che memorizzano dati personali nei post meta senza alcuna crittografia, o applicazioni Laravel che tengono sessioni illimitate nei file. Il problema è che molti sviluppatori non sanno che ogni dato personale ha un ciclo di vita: raccolta, trattamento, conservazione, cancellazione. Il codice deve gestirlo.
Mappatura dei dati: prima di scrivere una riga, sapere cosa e dove
Prima di implementare qualsiasi funzione, devi sapere: quali dati personali raccoglie l'applicazione? Dove vengono memorizzati? Per quanto tempo? Chi li può vedere?
Creare un registro dei trattamenti inline nel codice
Non serve un foglio Excel a parte. Puoi documentarlo con commenti strutturati o in un file JSON nel repository. Noi usiamo un array associativo in PHP con tabella, campi, finalità, base giuridica e retention. Esempio:
$data_map = [
'users.name' => [
'purpose' => 'Account registration',
'legal_basis' => 'Contract performance (Art. 6.1.b)',
'retention' => 'Until account deletion + 12 months for tax',
'encrypted' => false, // stored in DB, not sensitive
],
'users.email' => [
'purpose' => 'Communication, login',
'legal_basis' => 'Contract performance',
'retention' => 'Until account deletion or consent withdrawal',
'encrypted' => false,
],
'payments.card_last_four' => [
'purpose' => 'Payment reference',
'legal_basis' => 'Legal obligation (Art. 6.1.c)',
'retention' => '10 years for tax',
'encrypted' => true,
],
];
Questo ti permette di generare automaticamente un report per il DPO e di avere sotto controllo ogni campo.
Strumenti pratici per la mappatura
Usa le funzioni di database (information_schema in MySQL) per estrarre le tabelle con dati personali. Un semplice script SQL ti dà l'elenco:
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'nome_db';
Poi filtra manualmente le colonne sensibili. Non esiste automazione perfetta, ma riduci il rischio.
Consenso: non basta un banner, serve tracciarlo
Il GDPR richiede che il consenso sia: specifico, informato, inequivocabile e revocabile. Un banner che dice “Accetta tutti” senza granulare per finalità non è conforme. La normativa stabilisce che il consenso deve poter essere dimostrato (art. 7.1).
Implementazione di un consenso tracciato
Non usare cookie di terze parti senza consenso esplicito. Il metodo più robusto è salvare una stringa JSON nel localStorage o in un cookie tecnico firmato, con timestamp e scelta dell'utente. Esempio con JavaScript vanilla:
function setConsent(preferences) {
const data = {
version: '1.0',
timestamp: new Date().toISOString(),
preferences: preferences // {analytics: true, marketing: false, necessary: true}
};
// Salva in localStorage (non inviato al server)
localStorage.setItem('gdpr_consent', JSON.stringify(data));
}
Poi, nelle tue funzioni di attivazione script, leggi il consenso prima di caricare Google Analytics o Meta Pixel. Se l'utente revoca, cancella il contenuto localStorage e ferma gli script.
Attenzione: non usare il semplice “checkbox checked per default”. Il consenso deve essere attivo (opt-in).
Diritti dell'interessato: accesso, rettifica, cancellazione, portabilità
Ogni utente ha diritto di sapere cosa hai su di lui, di ottenere copia, di chiedere modifica o cancellazione. Devi implementarlo nel back-end.
API per l'esportazione dei dati
In Laravel, puoi creare un endpoint che raccoglie tutti i dati legati a un utente e restituisce un JSON scaricabile. Esempio:
// routes/api.php
Route::get('user/data-export', function (Request $request) {
$user = $request->user();
$personalData = [
'profile' => $user->only(['name', 'email', 'created_at']),
'orders' => $user->orders()->get()->toArray(),
'support_tickets' => $user->tickets()->get()->toArray(),
];
return response()->json($personalData)->withHeaders([
'Content-Disposition' => 'attachment; filename="personal-data.json"',
]);
})->middleware('auth:sanctum');
Assicurati di crittografare il file se inviato via email, e di fornire l'export entro 30 giorni (art. 12.3).
Cancellazione hard vs soft delete
La cancellazione richiesta (diritto all'oblio, art. 17) deve essere definitiva se non ci sono obblighi legali di conservazione. Non basta impostare un flag 'deleted_at' se i dati restano accessibili. Implementa un cron job che, dopo il periodo di retention, esegue DELETE fisico o rende anonimi i campi sensibili.
-- Anonimizzazione: sovrascrivi email con hash irreversibile
UPDATE users
SET email = CONCAT('deleted-', id, '@example.com'),
name = 'Deleted User',
updated_at = NOW()
WHERE deleted_at IS NOT NULL
AND deleted_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
Misure di sicurezza tecniche: crittografia e pseudonimizzazione
Il GDPR non prescrive algoritmi specifici (art. 32), ma chiede misure adeguate al rischio. Noi consigliamo almeno:
- Crittografia a riposo (AES-256) per DB se ospiti dati sanitari o finanziari.
- Crittografia in transito (TLS 1.3) per tutte le comunicazioni.
- Pseudonimizzazione: sostituisci identificatori diretti con un ID univoco per analisi.
Esempio di crittografia a livello di applicazione in PHP
// Usa openssl con chiave derivata da password forte (non hardcoded)
function encryptData($plaintext, $key) {
$iv = openssl_random_pseudo_bytes(16);
$ciphertext = openssl_encrypt($plaintext, 'aes-256-gcm', $key, 0, $iv, $tag);
return base64_encode($iv . $tag . $ciphertext);
}
function decryptData($encoded, $key) {
$data = base64_decode($encoded);
$iv = substr($data, 0, 16);
$tag = substr($data, 16, 16);
$ciphertext = substr($data, 32);
return openssl_decrypt($ciphertext, 'aes-256-gcm', $key, 0, $iv, $tag);
}
La chiave va conservata in variabili d'ambiente, non nel codice. Sui server Linux, usa openssl enc -aes-256-cbc per backup crittografati.
Violazione dei dati: logging e notifica obbligatoria
In caso di data breach, la notifica al Garante va fatta entro 72 ore (art. 33). Per farlo, devi avere log dettagliati di accessi anomali e modifiche ai dati personali.
Implementare un logger strutturato che non espone dati sensibili
// Esempio con Monolog (Laravel)
use Monolog\Handler\StreamHandler;
$logger = new \Monolog\Logger('security');
$logger->pushHandler(new StreamHandler(storage_path('logs/security.log'), \Monolog\Level::Warning));
$logger->warning('Failed login attempt', [
'user_id' => $userId,
'ip' => $request->ip(),
'timestamp' => now(),
// NON loggare password o token
]);
I log devono essere conservati in modo sicuro, con accesso ristretto e rotazione automatica (logrotate). Non loggare mai password, cookie di sessione, token di autenticazione o dati biometrici.
Responsabilità del titolare e del responsabile: contratti con terze parti
Se usi servizi esterni (Google Analytics, Mailchimp, AWS), devi stipulare un accordo di trattamento dati (DPA) con ciascuno. La maggior parte dei provider lo offre precompilato. Ma come sviluppatore devi garantire che l'integrazione tecnica rispetti il GDPR: ad esempio, non inviare dati a Google Analytics prima del consenso, non condividere indirizzi email completi con piattaforme di advertising senza anonimizzazione.
In sintesi — cosa fare adesso
- Mappa i dati personali della tua applicazione: crea un registro con tabella, campo, finalità, retention.
- Implementa un sistema di consenso granulare: salva le preferenze utente in localStorage, non caricare script di tracking prima del consenso.
- Crea endpoint per accesso, esportazione e cancellazione: l'utente deve poter esercitare i suoi diritti via interfaccia.
- Crittografa i dati sensibili: usa AES-256 per dati a riposo, TLS 1.3 in transito, pseudonimizza gli ID.
- Logga gli eventi di sicurezza: senza registrare dati personali, ma sufficienti per ricostruire un breach.
- Verifica i DPA con i fornitori esterni: non dare per scontato che lo faccia il cliente.
Noi di Meteora Web vediamo ogni giorno siti e app che non rispettano nemmeno i requisiti base. Non si tratta di burocrazia, ma di proteggere le persone. E se sei uno sviluppatore, è tua responsabilità tecnica. Inizia oggi: il GDPR non aspetta.
Sponsored Protocol