Best Practice Sicurezza
Linee guida per implementazioni sicure TCPDF-Next in produzione.
Gestione Password
NON Codificare Password
php
// ❌ MAI fare questo
$pdf->encrypt(new Aes256Encryptor('hardcoded-password', 'reader'));
// ✅ Usa variabili ambiente
$pdf->encrypt(new Aes256Encryptor(
ownerPassword: $_ENV['PDF_OWNER_PASSWORD'],
userPassword: $_ENV['PDF_USER_PASSWORD']
));Password Forti
- Minimo 12 caratteri
- Mix maiuscole/minuscole/numeri/simboli
- Evita parole dizionario
- Usa generatori password
Gestione Certificati
Storage Sicuro
php
// ✅ Percorsi fuori web root
$cert = CertificateInfo::fromPkcs12(
'/secure/certs/signing.p12',
$_ENV['CERT_PASSWORD']
);
// ❌ MAI in directory pubblica
$cert = CertificateInfo::fromPkcs12('/public/cert.p12', 'password');Rotazione Certificati
- Rinnova certificati prima scadenza
- Mantieni certificati vecchi per verifica firme storiche
- Usa HSM per chiavi produzione
Permessi File
bash
# Certificate files
chmod 600 /secure/certs/*.p12
chown www-data:www-data /secure/certs/*.p12
# Output directory
chmod 750 /secure/outputValidazione Input
php
// Sanitizza input utente
$filename = basename($_POST['filename']);
$filename = preg_replace('/[^a-zA-Z0-9._-]/', '', $filename);
if (!str_ends_with($filename, '.pdf')) {
$filename .= '.pdf';
}
$pdf->save("/secure/output/{$filename}");Audit Logging
php
// Log operazioni sicurezza
logger()->info('PDF firmato', [
'document' => $filename,
'signer' => $cert->subjectCN(),
'timestamp' => now(),
'ip' => request()->ip(),
]);Checklist Produzione
- [ ] Password in variabili ambiente
- [ ] Certificati fuori web root
- [ ] Permessi file corretti
- [ ] Input sanitizzato
- [ ] Logging audit abilitato
- [ ] HTTPS per trasmissione
- [ ] Backup certificati sicuro
- [ ] Piano rotazione certificati