Usa la checklist di sicurezza Claude Code per eseguire controlli rapidi e concreti su autenticazione, validazione input, gestione segreti e superfici di injection nelle web app.

Uno spot-check di sicurezza leggero è una revisione rapida (spesso 30–60 minuti) pensata per individuare problemi evidenti e ad alto impatto prima di spedire. Non è un audit completo. Pensalo come un giro di controllo sulla sicurezza: si scansionano i percorsi che falliscono più spesso nelle app reali e si cerca prova concreta, non supposizioni.
Questa checklist Claude Code si concentra sulle aree che si rompono più spesso nelle web app di tutti i giorni:
Non cerca di dimostrare l'assenza di bug, modellare attori di minaccia complessi o sostituire i test di penetrazione.
“Risultati concreti” significa che ogni problema che registri ha prove che uno sviluppatore può usare immediatamente. Per ogni finding cattura:
L'AI è un aiuto, non un’autorità. Usala per cercare, riassumere e proporre test. Poi verifica leggendo il codice e, quando possibile, riproducendo con una richiesta reale. Se il modello non riesce a indicare posizioni e passi specifici, tratta l'affermazione come non provata.
Una revisione rapida funziona solo se restringi l'obiettivo. Prima di chiedere a Claude Code di esaminare qualcosa, decidi cosa vuoi dimostrare oggi e cosa non stai controllando.
Inizia con 1–3 percorsi utente reali in cui gli errori costano denaro, espongono dati o concedono poteri. Buoni candidati sono login, reset password, checkout e schermate di modifica admin.
Poi nomina gli asset che devi proteggere. Sii specifico: account utente, azioni di pagamento, dati personali, operazioni riservate agli admin.
Scrivi anche le tue assunzioni di minaccia in parole semplici. Ti stai difendendo da un utente curioso che clicca, un attaccante esterno con script, o un insider con qualche accesso? La risposta cambia cosa significa “abbastanza buono”.
Infine, definisci pass e fail in modo che lo spot-check finisca con finding concreti, non sensazioni. Regole semplici funzionano bene:
Se non riesci a descrivere cosa significa fallire, lo scope è ancora troppo vago.
Uno spot-check funziona solo se il modello guarda nei posti giusti. Raccogli un piccolo bundle di codice e note così che la revisione produca prove, non congetture.
Inizia condividendo il percorso critico per la sicurezza: punti di ingresso delle request e il codice che decide chi è l'utente e cosa può fare. Includi solo abbastanza codice circostante per mostrare come fluisce il dato.
Un bundle pratico di solito include:
Aggiungi qualche riga di note sull'ambiente così le assunzioni sono esplicite: session vs JWT, dove vivono i token (cookie o header), comportamento di reverse proxy o API gateway, worker/cron queue, e qualsiasi endpoint “solo interno”.
Prima di inseguire bug, chiedi un inventario: punti di ingresso, endpoint privilegiati e store dati toccati. Questo evita superfici mancate.
Concorda anche un formato di output che obbliga a risultati concreti. Una semplice tabella funziona bene: Finding, Severità, Endpoint/file interessato, Evidenza (snippet o range di linee), Scenario di sfruttamento, Suggerimento di fix.
Timebox:
L'obiettivo non è la copertura perfetta. È un piccolo set di finding testabili.
Tieni l'app aperta mentre leggi. Naviga l'interfaccia e osserva quali request vengono inviate. Le note devono puntare a endpoint specifici, parametri e sorgenti dati.
Un workflow che entra in una sola sessione:
Un’abitudine utile: per ogni “sembra a posto”, scrivi cosa faresti per romperlo. Se non riesci a descrivere un tentativo di rottura, probabilmente non l'hai verificato.
L'autenticazione è dove l'app decide: “questa richiesta appartiene a questa persona.” Un rapido spot-check non serve a leggere ogni linea. Serve a trovare il punto in cui l'identità viene stabilita, poi controllare scorciatoie e percorsi di failure.
Individua il confine di fiducia: dove l'identità viene creata o accettata? Può essere un cookie di sessione, un token JWT bearer, una API key o mTLS al bordo. Chiedi a Claude Code di indicare il file e la funzione esatti che trasformano “anonimo” in un user id, e di elencare ogni altro percorso che può fare lo stesso.
Controlli Authn da esaminare:
Un esempio pratico: se le email di reset restituiscono “account non trovato”, questo è un problema rapido di enumerazione. Anche con un messaggio generico, differenze di timing possono rivelare lo stesso fatto, quindi verifica anche i tempi di risposta.
L'autorizzazione è la domanda che causa più danni quando è sbagliata: “Questo utente può fare questa azione su questa risorsa esatta?” Uno spot-check rapido deve cercare intenzionalmente di infrangere quell'assunto.
Scrivi ruoli e permessi in linguaggio semplice. Mantienilo umano:
Poi verifica che ogni azione sensibile applichi authz sul server, non solo nell'interfaccia. I pulsanti possono essere nascosti, le rotte bloccate nel client, ma un attaccante può comunque chiamare l'API direttamente.
Una scansione rapida che solitamente trova problemi reali:
L'odore classico di IDOR è semplice: una request come GET /projects/{id} dove {id} è controllato dall'utente, e il server lo carica senza verificare che appartenga all'utente o al tenant corrente.
Un prompt che costringe a una risposta reale:
“Per questo endpoint, mostra il codice esatto che decide l'accesso, e elenca le condizioni specifiche che permetterebbero a un utente di un diverso orgId di accedervi. Se non ce ne sono, spiega perché indicando file e nomi di funzione.”
La maggior parte dei problemi rapidi in web app nasce da una lacuna: l'app accetta input che lo sviluppatore non si aspettava. Tratta “input” come qualsiasi cosa che un utente o un altro sistema può influenzare, anche se sembra innocua.
Inizia nominando gli input per l'endpoint che stai controllando:
La validazione dovrebbe avvenire vicino al punto di ingresso dei dati, non in profondità nella business logic. Controlla le basi: tipo (stringa vs numero), lunghezza massima, obbligatorio vs opzionale e formato (email, UUID, data).
Per valori noti come ruoli, stati o direzioni di ordinamento, preferisci una allowlist. È più difficile da bypassare rispetto a “bloccare pochi valori cattivi”.
Controlla anche la gestione degli errori. Se l'app rifiuta input, non rispedire il valore grezzo nella risposta, nei log o nell'interfaccia. È così che piccoli bug di validazione diventano fughe di dati o aiutano l'injection.
Un mini-piano “input malformato” per endpoint rischiosi (login, ricerca, upload, azioni admin):
Esempio: un parametro di sort che accetta qualsiasi stringa può diventare un frammento SQL. Una allowlist come "date" o "price" previene quella classe di errori.
La maggior parte delle revisioni rapide trova problemi negli stessi posti: ovunque l'input utente venga interpretato come codice, query, percorso o URL. Qui si cercano i momenti in cui “l'input attraversa un confine di fiducia”.
Traccia i dati dai punti di ingresso (query params, header, cookie, upload, form admin) a dove finiscono.
Cerca questi pattern e richiedi un sito d'uso e un esempio di payload per ciascuno:
ORDER BY dinamici e builder IN (...) che uniscono valori utenteFai attenzione anche a deserializzazione e template injection. Qualsiasi cosa che parsifica JSON, YAML o stringhe template fornite dall'utente può nascondere comportamento rischioso, specialmente se supporta tipi custom, espressioni o rendering server-side.
Se una funzionalità accetta un URL, un filename o testo formattato, assumi che possa essere abusata finché non dimostri il contrario con percorsi di codice e test.
I problemi coi segreti sono spesso rumorosi una volta che sai dove guardare. Concentrati su dove i segreti vivono e dove possono essere copiati accidentalmente.
Posti comuni dove i segreti compaiono:
Poi forza una risposta concreta: se un segreto è esposto oggi, cosa succede dopo? Un buon sistema ha una strada di rotazione (nuova chiave emessa), revoca (vecchia chiave disabilitata) e modo per ridistribuire velocemente. Se la risposta è “lo cambieremmo più tardi”, trattalo come finding.
Least privilege è un altro risparmio veloce. Gli incidenti peggiorano perché le chiavi hanno permessi troppo ampi. Cerca utenti DB che possono droppare tabelle, token di terze parti che gestiscono account o API key condivise tra ambienti. Preferisci una chiave per servizio, per ambiente, con il minimo set di permessi.
Prompt rapidi per spot-check da incollare in Claude Code:
Infine, conferma i guardrail: blocca i segreti dal versionamento (pre-commit/CI), e assicurati che backup o snapshot non includano credenziali in chiaro. Se la piattaforma supporta snapshot e rollback, verifica che i segreti siano iniettati a runtime, non bake-ati nelle immagini salvate.
I prompt vaghi ottengono risposte vaghe. Costringi il modello a impegnarsi con prove: posizioni esatte, un tracciamento che puoi seguire, un repro che puoi eseguire e cosa renderebbe falsa l'affermazione.
Usa un pattern alla volta, poi chiedi una revisione dopo che confermi o rifiuti un dettaglio.
Se l'output è ancora vago, stringi:
“Rispondi solo con: percorso file, nome funzione, linea rischiosa e impatto in una frase.”
Gli endpoint di aggiornamento profilo spesso nascondono bug di controllo accessi. Ecco un caso piccolo che puoi percorrere con questa checklist.
Scenario: un endpoint API aggiorna un profilo utente:
PATCH /api/profile?accountId=123 con JSON come { "displayName": "Sam" }.
Chiedi a Claude Code di trovare l'handler, tracciare come viene usato accountId e dimostrare se il server applica il controllo di proprietà.
Quello che emerge spesso:
accountId dalla query string e aggiorna quell'account senza verificare che corrisponda all'utente loggato.displayName viene trimmato, ma accountId non è validato come intero."... WHERE account_id=" + accountId.Una buona segnalazione è concreta:
accountId; la SQL è costruita da input non attendibileaccountId dal client, usa l'id dell'utente autenticato sul server; parametrizza la queryaccountId non numericiDopo la patch, ricontrolla velocemente:
accountId e conferma che fallisce.Il modo più veloce per perdere una vulnerabilità è fidarsi di ciò che l'interfaccia sembra imporre. Un pulsante nascosto o disabilitato non è un controllo di permesso. Se il server accetta comunque la richiesta, chiunque può riprodurla cambiando user ID, ruolo o facendo una chiamata API diretta.
Un altro errore comune è una richiesta vaga. “Fai una revisione di sicurezza” di solito produrrà un rapporto generico. Uno spot-check ha bisogno di scope stringenti (quali endpoint, quali ruoli, quali dati) e di un formato di output rigoroso (nome file, funzione, linea rischiosa, repro minimo).
La stessa regola vale per l'output AI: non accettare affermazioni senza riferimenti. Se un finding non include una posizione di codice concreta e un modo passo-passo per scatenarlo, trattalo come non provato.
Queste trappole ricorrono spesso:
Se ti ritrovi ad aggiungere filtri per ogni nuovo edge case, fermati. La correzione sta quasi sempre prima e più semplice: valida gli input al confine e rendi i controlli di autorizzazione espliciti e centralizzati così che ogni percorso li usi.
Non sostituiscono una revisione completa, ma catturano errori che sfuggono quando tutti sono stanchi. Mantienili focalizzati su quello che puoi provare in fretta: una request che puoi inviare, una pagina che puoi caricare, una riga di log che puoi trovare.
Cinque spot-check rapidi che pagano spesso:
Scrivi le prime 3 correzioni che puoi spedire questa settimana, non una wishlist. Esempio: (1) aggiungere rate limiting a login e reset password, (2) imporre controlli di proprietà server-side sull'endpoint "get by id", (3) limitare la lunghezza degli input e rifiutare caratteri inaspettati per il campo di ricerca.
Uno spot-check paga solo se i risultati cambiano ciò che spedisci. Tratta questa checklist come un piccolo step ripetibile di build, non una missione di salvataggio una tantum.
Trasforma ogni finding in una voce di backlog difficile da fraintendere:
Scegli una cadenza che si adatti al rischio e alla dimensione del team. Per molti team, ogni release è l'ideale. Se le release sono frequenti, fai una revisione da 30–60 minuti mensile e un controllo più breve prima di spedire.
Rendi più semplice la ripetizione creando un pacchetto di prompt riutilizzabile e un template di checklist. Mantieni i prompt focalizzati su output concreti: mostra la route, la guardia, la request che fallisce e il comportamento atteso. Conserva il pacchetto dove il team lavora già per non farlo saltare.
Se costruisci app tramite chat, integra la checklist nella pianificazione. Aggiungi una breve nota sulle “assunzioni di sicurezza” per authn/authz, input e segreti, poi esegui lo spot-check subito dopo la prima versione funzionante.
Piattaforme come Koder.ai (koder.ai) possono adattarsi bene a questa abitudine perché permettono iterazioni veloci mantenendo checkpoint di revisione. Usare snapshot e rollback intorno a cambi rischiosi rende più facile spedire fix di sicurezza senza restare bloccati quando una modifica rompe il comportamento.