Utilisez une checklist de sécurité Claude Code pour effectuer des vérifications rapides et concrètes sur l'auth, la validation d'entrées, la gestion des secrets et les surfaces d'injection dans les applications web.

Une vérification de sécurité légère est une revue rapide (généralement 30–60 minutes) destinée à repérer les problèmes évidents et à fort impact avant mise en production. Ce n’est pas un audit complet. Pensez-y comme une inspection de sécurité : vous parcourez les chemins qui échouent le plus souvent dans les applis réelles et vous cherchez des preuves, pas des suppositions.
Cette checklist Claude Code se concentre sur les zones qui cassent le plus souvent dans les apps web du quotidien :
Elle ne cherche pas à prouver l'absence de bugs, à modéliser des attaquants complexes, ni à remplacer des tests d'intrusion.
« Constats concrets » signifie que chaque problème que vous consignez comporte des preuves exploitables immédiatement par un développeur. Pour chaque constat, capturez :
L'IA est un assistant, pas une autorité. Utilisez-la pour chercher, résumer et proposer des tests. Vérifiez ensuite en lisant le code et, si possible, en reproduisant avec une requête réelle. Si le modèle ne peut pas pointer des emplacements et étapes précis, considérez l'affirmation comme non prouvée.
Une revue rapide ne fonctionne que si vous visez un périmètre restreint. Avant de demander à Claude Code d’examiner quoi que ce soit, décidez ce que vous voulez prouver aujourd’hui et ce que vous n’allez pas vérifier.
Commencez par 1 à 3 parcours utilisateur réels où une erreur coûte de l'argent, expose des données ou accorde des pouvoirs. Bons candidats : login, réinitialisation de mot de passe, checkout, écrans d'édition admin.
Ensuite, nommez les actifs à protéger. Soyez spécifique : comptes utilisateurs, actions de paiement, données personnelles, opérations réservées aux admins.
Écrivez ensuite vos hypothèses de menace en termes simples. Vous défendez-vous contre un utilisateur curieux cliquant partout, un attaquant externe avec des scripts ou un initié avec certains accès ? La réponse change ce qui est « suffisant ».
Enfin, définissez pass/fail afin que la vérification produise des constats concrets, pas des impressions. Des règles simples fonctionnent bien :
Si vous ne pouvez pas décrire ce qu'est un échec, le périmètre est encore trop flou.
Une vérification ne marche que si le modèle regarde aux bons endroits. Rassemblez un petit lot de code et de notes pour que la revue produise des preuves, pas des suppositions.
Commencez par partager le chemin critique en sécurité : points d'entrée de requêtes et le code qui décide qui est l'utilisateur et ce qu'il peut faire. Incluez juste assez de code autour pour montrer le flux des données.
Un lot pratique comprend généralement :
Ajoutez quelques lignes de notes d'environnement pour expliciter les hypothèses : session vs JWT, où vivent les tokens (cookie ou header), comportement du reverse proxy ou API gateway, workers/queues/cron, et tout endpoint « interne uniquement ».
Avant de chasser des bugs, demandez un inventaire : points d'entrée, endpoints privilégiés, et stores de données touchés. Cela évite de manquer des surfaces.
Accordez-vous aussi sur un format de sortie qui force des constats concrets. Un tableau simple fonctionne bien : Constat, Sévérité, Endpoint/fichier affecté, Preuve (extrait exact ou plage de lignes), Scénario d'exploitation, Suggestion de correction.
Timebox :
L'objectif n'est pas la couverture parfaite. C'est un petit ensemble de constats testables.
Gardez l'app ouverte pendant la lecture. Parcourez l'UI et observez quelles requêtes sont envoyées. Les notes doivent pointer vers des endpoints, paramètres et sources de données spécifiques.
Un workflow réalisable en une session :
Une habitude utile : pour chaque « ça semble correct », écrivez comment vous le casseriez. Si vous ne pouvez pas décrire une tentative de cassure, vous ne l'avez probablement pas vérifié.
L'authentification, c'est l'endroit où l'app décide « cette requête appartient à cette personne ». Une vérification rapide ne consiste pas à lire chaque ligne. C'est trouver l'endroit où l'identité est établie, puis vérifier les raccourcis et chemins d'échec.
Localisez la frontière de confiance : où l'identité est-elle d'abord créée ou acceptée ? Ça peut être un cookie de session, un token JWT bearer, une clé API, ou du mTLS en périphérie. Demandez à Claude Code de pointer le fichier et la fonction exacts qui transforment « anonyme » en un id utilisateur, et de lister chaque autre chemin qui peut faire la même chose.
Vérifications d'authn à parcourir :
Exemple pratique : si les emails de reset renvoient « compte introuvable », c'est un problème d'énumération. Même avec un message générique, des différences de timing peuvent fuir la même information, donc vérifiez aussi les temps de réponse.
L'autorisation est la question qui cause le plus de dégâts quand elle est fausse : « Cet utilisateur peut-il faire cette action sur cette ressource précise ? » Une vérification rapide doit chercher à casser cette hypothèse volontairement.
Écrivez les rôles et permissions en langage simple. Gardez-le humain :
Puis vérifiez que chaque action sensible applique l'authz côté serveur, pas seulement dans l'UI. Les boutons peuvent être cachés, les routes bloquées côté client, mais un attaquant peut toujours appeler l'API directement.
Un scan rapide qui trouve souvent des problèmes :
L'odeur classique d'IDOR : une requête comme GET /projects/{id} où {id} est contrôlé par l'utilisateur et le serveur le charge sans vérifier qu'il appartient à l'utilisateur ou au tenant courant.
Un prompt qui force une vraie réponse :
« Pour cet endpoint, montrez le code exact qui décide l'accès, et listez les conditions spécifiques qui permettraient à un utilisateur d'un autre orgId d'y accéder. Si aucune, expliquez pourquoi en donnant fichiers et noms de fonctions. »
La plupart des bugs rapides commencent par une lacune : l'app accepte des entrées que le développeur n'attendait pas. Traitez « entrée » comme tout ce qu'un utilisateur ou un autre système peut influencer, même si ça semble inoffensif.
Commencez par nommer les entrées pour l'endpoint que vous vérifiez :
La validation doit se produire près du point d'entrée, pas profondément dans la logique métier. Vérifiez le basique : type (string vs number), longueur max, requis vs optionnel, et format (email, UUID, date).
Pour des valeurs connues comme rôles, statuts ou directions de tri, préférez une allowlist. C'est plus difficile à contourner qu'« on bloque quelques valeurs ».
Vérifiez aussi le traitement des erreurs. Si l'app rejette une entrée, n'échoez pas la valeur brute dans la réponse, les logs ou l'UI. C'est comme ça que de petits bugs de validation deviennent des fuites de données ou des aides pour l'injection.
Un mini-plan « mauvaise entrée » pour endpoints risqués (login, search, upload, actions admin) :
Exemple : un paramètre de tri qui accepte n'importe quelle chaîne peut devenir un fragment SQL plus loin. Une allowlist comme "date" ou "price" évite ce type d'erreur tôt.
La plupart des revues rapides trouvent des problèmes aux mêmes endroits : partout où l'entrée utilisateur est interprétée comme du code, une requête, un chemin ou une URL. Ici, chassez les moments où « l'entrée traverse une frontière de confiance ».
Tracez les données depuis les points d'entrée (query params, headers, cookies, uploads, formulaires admin) jusqu'à leurs usages.
Cherchez ces motifs et exigez un site d'appel concret et un exemple de payload pour chacun :
ORDER BY dynamique, et builders IN (...) qui joignent des valeurs utilisateursSurveillez aussi la désérialisation et l'injection de template. Tout ce qui parse du JSON, YAML ou des chaînes templatisées fournies par l'utilisateur peut cacher un comportement risqué, surtout si ça supporte des types personnalisés, des expressions ou du rendu côté serveur.
Si une fonctionnalité accepte une URL, un nom de fichier ou du texte formaté, supposez qu'elle peut être abusée jusqu'à preuve du contraire avec des chemins et tests concrets.
Les problèmes de secrets sont souvent bruyants une fois que vous savez où regarder. Concentrez-vous sur où les secrets vivent et où ils peuvent être copiés accidentellement.
Endroits courants où les secrets apparaissent :
Ensuite, forcez une réponse concrète : si un secret est exposé aujourd'hui, que se passe-t-il ensuite ? Un bon système a un chemin de rotation (nouvelle clé émise), révocation (ancienne clé désactivée), et moyen de redéployer rapidement. Si la réponse est « on le changerait plus tard », considérez cela comme un constat.
Le principe du moindre privilège est aussi une victoire rapide. Les incidents empirent parce que les clés sont sur-puissantes. Cherchez des utilisateurs DB qui peuvent dropper des tables, des tokens tiers qui peuvent gérer des comptes, ou des API keys partagées entre environnements. Préférez une clé par service, par environnement, avec le minimum de permissions.
Prompts rapides à coller dans Claude Code :
Enfin, confirmez des garde-fous : bloquer les secrets du contrôle de source (pre-commit/CI), et vous assurer que les backups ou snapshots n'incluent pas de credentials en clair. Si la plateforme supporte snapshots et rollback, vérifiez que les secrets sont injectés à l'exécution, pas incorporés dans des images sauvegardées.
Les prompts vagues donnent des réponses vagues. Forcez le modèle à s'engager sur des preuves : emplacements exacts, un trace que vous pouvez suivre, une repro exécutable, et ce qui rendrait l'affirmation fausse.
Utilisez un pattern à la fois, puis demandez une révision après confirmation ou rejet d'un détail.
Si la sortie reste floue, recadrez :
« Réponds uniquement avec : chemin de fichier, nom de fonction, ligne risquée, et impact en une phrase. »
Les endpoints de mise à jour de profil cachent souvent des erreurs de contrôle d'accès. Voici un petit cas à traiter avec cette checklist.
Scénario : un endpoint API met à jour un profil utilisateur :
PATCH /api/profile?accountId=123 avec un JSON comme { "displayName": "Sam" }.
Vous demandez à Claude Code de trouver le handler, tracer comment accountId est utilisé, et prouver si le serveur applique la propriété.
Ce qui apparaît souvent :
accountId depuis la query string et met à jour ce compte sans vérifier qu'il correspond à l'utilisateur connecté.displayName est trimé, mais accountId n'est pas validé en entier."... WHERE account_id=" + accountId.Un bon rapport est concret :
accountId est changé ; le SQL est construit depuis une entrée non fiableaccountId venant du client, utiliser l'id du compte authentifié côté serveur ; paramétrer la requêteaccountId non numériqueAprès correction, re-vérifiez rapidement :
accountId et confirmez l'échec.La façon la plus rapide de manquer une vulnérabilité est de faire confiance à ce que l'UI semble imposer. Un bouton caché ou désactivé n'est pas une vérification de permission. Si le serveur accepte quand même la requête, n'importe qui peut la rejouer avec un autre ID, rôle ou appel direct à l'API.
Un autre échec fréquent est une demande vague. « Faire une revue de sécurité » donne souvent un rapport générique. Une vérification rapide a besoin d'un périmètre serré (quels endpoints, quels rôles, quelles données) et d'un format de sortie strict (nom de fichier, fonction, ligne risquée, repro minimale).
La même règle vaut pour la sortie IA : n'acceptez pas d'affirmations sans pointeurs. Si un constat n'inclut pas un emplacement de code concret et une démarche pas à pas pour le déclencher, considérez-le non prouvé.
Ces pièges reviennent souvent :
Si vous ajoutez sans cesse des filtres après chaque nouveau cas, marquez une pause. La correction est souvent plus simple et plus en amont : valider aux frontières et centraliser les vérifications d'autorisation pour que tous les chemins y passent.
Cela ne remplace pas une revue complète, mais ça attrape des erreurs glissées quand tout le monde est fatigué. Gardez-les focalisées sur ce que vous pouvez prouver vite : une requête à envoyer, une page à charger, une ligne de log à trouver.
Cinq spot-checks rapides qui rapportent souvent :
Notez les 3 corrections prioritaires que vous pouvez livrer cette semaine, pas une liste de souhaits. Exemple : (1) ajouter du rate limiting au login et reset, (2) appliquer des vérifications de propriété côté serveur sur l'endpoint “get by id”, (3) limiter la longueur d'entrée et rejeter les caractères inattendus pour le champ recherche.
Une vérification n'est utile que si ses résultats influencent ce que vous livrez. Traitez cette checklist comme une petite étape reproductible de build, pas une mission de sauvetage ponctuelle.
Transformez chaque constat en ticket clair :
Choisissez une cadence adaptée au risque et à la taille de l'équipe. Pour beaucoup, chaque release est idéale. Si les releases sont fréquentes, faites une revue de 30–60 minutes mensuelle et une vérif plus courte avant mise en production.
Facilitez la répétition en créant un pack de prompts réutilisables et un modèle de checklist. Gardez les prompts focalisés sur des sorties concrètes : montre la route, la garde, la requête qui échoue, et le comportement attendu. Stockez le pack là où l'équipe travaille déjà pour qu'il ne soit pas oublié.
Si vous construisez des apps via chat, intégrez la checklist dès la planification. Ajoutez une courte note d'« hypothèses de sécurité » pour authn/authz, inputs et secrets, puis lancez le spot-check dès la première version fonctionnelle.
Les plateformes comme Koder.ai (koder.ai) s'intègrent bien à cette habitude car elles permettent d'itérer vite tout en conservant des checkpoints de revue. Utiliser snapshots et rollback autour de changements risqués facilite la livraison des corrections de sécurité sans rester bloqué quand un changement casse un comportement.