Codage d'application web sécurisé
Transforme l'OWASP Top 10:2025, l'ASVS 5.0, la Cheat Sheet Series et du matériel WSTG sélectionné en conseils pratiques de sécurité pour applications web.
Par défaut (en ligne) : écrivez du code sécurisé en silence ; ne signalez que le problème à plus fort impact que vous voyez à proximité.
Audit : sur "review", "audit", "harden", "est-ce sécurisé ?" ou suivi d'incident — lisez assets/audit-checklist.md et produisez des conclusions priorisées.
Modes, invoqués sous la forme $secure-webapp <mode> :
$secure-webapp audit: revue priorisée complète ; lisezassets/audit-checklist.md.$secure-webapp quick-check: passage à plus haut risque uniquement — autorisation, auth/session, secrets, injection/XSS, téléversements, SSRF, jetons. Pas de rapport complet basé sur une liste de contrôle.$secure-webapp harden: appliquez directement les modifications sécurisées là où les éditions sont autorisées ; petits correctifs qui préservent l'architecture ; vérifiez et signalez tout ce qui nécessite une approbation produit.$secure-webapp remediate: boucle audit→correction itérative ; lisezassets/remediate-checklist.mden entier d'abord.$secure-webapp design-review: modèle de menace avant implémentation — hypothèses, limites de confiance, cas d'abus, contrôles indispensables, questions non résolues.$secure-webapp report: rédigez un rapport formel dansdocs/security-audit-report-YYYY-MM-DD.md; lisezassets/report-template.mden entier d'abord et suivez chaque étape. Nécessite un audit préalable dans cette session. Écrivez dans le fichier, jamais dans le chat.$secure-webapp update: mettez à jour cette installation en exécutantnpx --yes github:hov172/secure-webapp-skill --global. Il vérifie la version et ne réinstalle que lorsqu'une version plus récente existe. Indicateurs :--claude/--codex/--gemini,--check,--force.$secure-webapp maintain: mettez à jour le package de compétence lui-même, à partir d'un clone du dépôt source — voirscripts/README.md.
Ne chargez que les références dont la tâche a besoin. Ne les chargez jamais toutes en bloc.
Routage
| La tâche implique | Charger |
|---|---|
| Chaînes non fiables interprétées comme HTML/DOM/SQL/shell/NoSQL/LDAP/regex/CSV | references/input-handling.md |
| Connexion, inscription, mots de passe, MFA, réinitialisation, force brute, sessions, cookies, déconnexion | references/auth-and-sessions.md |
| Permissions, rôles, vérifications de propriété, IDOR, isolation des locataires | references/authorization.md |
| JWT, jetons API/refresh, signature et vérification, OAuth/OIDC, PKCE, état | references/tokens-and-oauth.md |
| Points de terminaison REST/GraphQL/WebSocket, limites de débit, affectation en masse, forme de réponse, téléversements/téléchargements, traversée de chemin, URL pré-signées | references/apis-and-files.md |
| Secure/HttpOnly/SameSite, CSP, CORS, CSRF, en-têtes, iframes, postMessage | references/frontend-and-headers.md |
Variables d'environnement, .env, clés, gestionnaire de secrets, mode débogage, valeurs par défaut | references/secrets-and-config.md |
| Chiffrement, hachage de mots de passe, algorithmes, gestion des clés, PII | references/data-and-crypto.md |
| Dépendances, lockfiles, SBOM, CI/CD, GitHub Actions, artefacts signés | references/supply-chain.md |
| URL externes contrôlées par l'utilisateur, SSRF, conditions de course, désérialisation, pollution du prototype | references/secure-coding.md |
| Journalisation, réponses d'erreur, traces de pile, pistes d'audit, échec-fermé, restauration | references/logging-and-errors.md |
| Conception de nouvelles fonctionnalités, modélisation des menaces, multi-location, décisions sécurisées dès la conception | references/insecure-design.md |
| Fonctionnalités LLM/IA, construction d'invites, RAG, appels d'outils agents, serveurs MCP, sortie de modèle rendue ou exécutée | references/ai-and-llm.md |
Liste de surveillance permanente
Signalez ces éléments au passage lorsqu'ils sont vus dans du code web, avec un correctif concret :
- Absence de vérifications d'autorisation/auth du côté serveur sur les routes de ressources. Préférez un cadrage au niveau de la requête tel que
WHERE owner_id = :current_user. - Secrets codés en dur, identifiants, secrets JWT, clés API ou fichiers
.envcommités. - Requêtes SQL/NoSQL/shell construites par concaténation de chaînes. Utilisez des requêtes paramétrées, des builders sécurisés ou des API argv.
- Mots de passe en texte brut ou hachés avec un algorithme rapide. Utilisez argon2id, scrypt ou bcrypt ; PBKDF2 uniquement lorsque requis.
- Vérification JWT avec des algorithmes non épinglés, vérifications
exp/iss/audmanquantes ou secrets dans le code. dangerouslySetInnerHTML,v-htmlouinnerHTMLavec du contenu utilisateur. Rendez-le sous forme de texte ou nettoyez-le.- CORS avec des informations d'identification et une origine générique ou écho. Utilisez une liste blanche stricte.
- Absence de limites de débit sur les points de terminaison de connexion, inscription, réinitialisation, MFA/OTP ou coûteux.
- Erreurs de production verbeuses, traces de pile, détails SQL/ORM ou mode débogage exposés aux clients.
- Redirections ouvertes à partir de paramètres
next,returnToou URL non validés. - SSRF à partir d'URL fournies par l'utilisateur sans liste blanche et blocage d'IP privée après DNS et redirections.
- Journaux contenant des mots de passe, jetons, ID de session, secrets ou PII inutiles.
- Contrôles de sécurité côté client uniquement : champs cachés, boutons désactivés, revendications de rôle côté client, validation frontend uniquement.
- Téléversements de fichiers sans contrôle de taille, type, chemin, stockage ou nom généré.
- Chemins d'exception ouverts (fail-open) autour de l'auth, l'autorisation, les limites de débit, les indicateurs de fonctionnalité ou les transactions.
- Changements d'état non atomiques pour les soldes, quotas, paiements, stocks, coupons ou jetons à usage unique.
- Sortie de modèle/LLM atteignant un puits non vérifié —
innerHTML, shell, SQL, chemins de fichiers, URLfetchou un agent en aval. Traitez-la comme une entrée non fiable. - Appels d'outils agents autorisés par rapport au compte de service plutôt qu'à l'utilisateur final, ou outils génériques
run_shell/execute_sql/http_requestqui transforment l'injection d'invite en RCE, SQLi ou SSRF. - Texte non fiable concaténé dans une invite système ; secrets ou données d'autres utilisateurs dans le contexte du modèle.
- Références mutables de dépendances ou d'actions CI là où l'épinglage et les lockfiles sont attendus — une balise déplacée exécute le code de l'attaquant dans ce travail avec les secrets de ce travail. Notez Élevé lorsque le travail contient des identifiants de déploiement, des clés de signature ou des droits de publication ; de même pour les identifiants cloud de longue durée là où OIDC existe. Auditez chaque espace de travail dans un monorepo, et signalez un
--audit-levelinférieur àhigh.
Comportement
- Écrivez du code sécurisé par défaut, sans longues explications. Nommez brièvement les choix pertinents pour la sécurité lorsque c'est utile.
- Adaptez la rigueur aux enjeux de l'application ; n'imposez pas de contrôles d'entreprise dans des prototypes jetables.
- Ne générez jamais intentionnellement du code non sécurisé. Proposez l'équivalent sûr et énoncez la contrainte en une phrase.
- Pour les nouvelles fonctionnalités franchissant une limite de confiance, vérifiez : entrée non fiable, autorisation, mode de défaillance, données stockées, voie d'abus.
- Lors d'un audit, inspectez le code réel, posez uniquement les questions de cadrage essentielles et rapportez la sévérité + emplacement + preuve + correctif, priorisé.
- Ne citez pas les numéros d'exigence OWASP sauf si demandé.
- Ne prétendez pas effectuer de tests d'intrusion ; il s'agit d'une revue de code et de conception.
Périmètre
Piles web courantes — Next.js, Express, Django, Flask, FastAPI, Rails, Spring, Laravel, Go et similaires. Pour les domaines de niche que les références ne couvrent pas, dites-le et pointez vers la source OWASP pertinente plutôt que de deviner.
Indépendant de l'agent : fonctionne dans Claude Code, Codex, Gemini CLI et tout autre outil qui charge des compétences ou lit AGENTS.md/GEMINI.md. Lorsque ce fichier nomme un outil, utilisez l'équivalent de votre environnement.