Regola
Rimuovi il codice di debug e temporaneo prima dei commit.
Il codice che aggira la logica, genera output di debug
o interrompe l'esecuzione a fini di debug è
stato probabilmente lasciato per errore durante lo sviluppo.
Linguaggi supportati: 45+Introduzione
Il codice di debug, console.log() le istruzioni, la logica commentata, i valori di test hardcoded o debugger i breakpoint arrivano in produzione molto più spesso di quanto la maggior parte dei team sia disposta ad ammettere. Questi elementi espongono lo stato interno dell'applicazione, introducono un sovraccarico di prestazioni e segnalano agli attaccanti quali parti della codebase presentavano problemi durante lo sviluppo. Quello che inizia come codice temporaneo per la risoluzione dei problemi diventa un rischio per la sicurezza permanente se non viene rimosso prima del deployment.
Perché è importante
Implicazioni di sicurezza: Il codice di debug in produzione registra spesso dati sensibili come credenziali utente, chiavi API o informazioni personali (PII) che non dovrebbero finire nei log di produzione.
A console.log(user) l'istruzione potrebbe scaricare un intero oggetto utente, inclusi i token di sessione, nella console del browser o nei log del server accessibili al personale di supporto o agli strumenti di aggregazione dei log. Questa è una delle vulnerabilità di sicurezza del codice più comunemente rilevate dagli strumenti di code review automatizzati.
Impatto sulle prestazioni: un logging eccessivo tramite console crea un collo di bottiglia di I/O. Un endpoint ad alto traffico che registra i payload delle richieste può peggiorare i tempi di risposta di 15-30 ms per richiesta e gonfiare i costi di archiviazione dei log. L'impatto sulle prestazioni del logging negli ambienti di produzione Node.js si amplifica rapidamente su scala.
Manutenibilità del codice: I commit di codice temporaneo come if (true) return; oppure
// TODO: fix later aggirano la logica di business e generano confusione per i futuri manutentori. Rappresentano debito tecnico privo di qualsiasi traccia di documentazione.
Ampliamento della superficie di attacco: le istruzioni del debugger e la registrazione dettagliata degli errori rivelano stack trace, percorsi di file, versioni delle dipendenze e flussi logici interni, ovvero informazioni utili per l'attività di ricognizione durante attacchi mirati.
Esempi di codice
❌ Non conforme:
async function processPayment(userId, amount) {
console.log('Processing payment:', { userId, amount });
const user = await db.users.findById(userId);
console.log('User data:', user); // Logs email, tokens, everything
debugger;
const result = await paymentGateway.charge({
userId: user.id,
amount: amount
});
console.log('Gateway response:', result);
return result;
}
Perché questo non è sicuro: le istruzioni console registrano PII (informazioni di identificazione personale) e token di autenticazione nei log di produzione. Il debugger commentato crea ambiguità sui percorsi di esecuzione. Tutti questi dati sono accessibili a chiunque disponga dell'accesso ai log e forniscono agli aggressori informazioni utili per la ricognizione.
✅ Conforme:
async function processPayment(userId, amount) {
const user = await db.users.findById(userId);
if (!user) {
throw new PaymentError('User not found');
}
const result = await paymentGateway.charge({
userId: user.id,
amount: amount
});
await auditLog.record({
event: 'PAYMENT_PROCESSED',
userId: userId,
transactionId: result.transactionId
});
return result;
}Perché questo approccio è sicuro: Il logging strutturato sostituisce console.log con audit trail adeguati che registrano gli eventi di business senza esporre dati sensibili degli utenti. Non sono presenti istruzioni di debug. I flussi logici procedono in modo lineare senza bypass condizionali. I log di audit sono centralizzati, protetti da controllo degli accessi e contengono solo il contesto necessario per la conformità e il debugging.
Conclusione
Il codice di debug in produzione non è un problema minore: è una vulnerabilità di sicurezza, un rischio per le prestazioni e un onere di manutenzione. Seguire le best practice di code review significa intercettare questi problemi prima che arrivino al ramo principale. Le regole di code quality automatizzate dovrebbero impedire al codice di debugging di raggiungere il controllo di versione, per non parlare della produzione. La chiave è disporre degli strumenti giusti per intercettare questi problemi prima che vengano uniti (merge).

