Skip to content

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/output

Validazione 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

Rilasciato sotto licenza LGPL-3.0-or-later.