Communitygithub.com

revue-de-securite

Utilisez cette compétence lors de l'ajout d'authentification, du traitement de saisie utilisateur, de la manipulation de secrets, de la création de points d'accès API ou de l'implémentation de fonctionnalités de paiement ou sensibles. Fournit une checklist de sécurité complète et des modèles.

Qu'est-ce que revue-de-securite ?

Cette compétence, 'revue-de-securite', est conçue pour être activée lorsqu'un agent IA (tel que Claude Code) détecte des opérations liées à la sécurité dans le code : ajout d'authentification, traitement de saisie utilisateur, gestion des secrets, création de nouvelles API, implémentation de paiements ou stockage de données sensibles. Elle fournit une checklist exhaustive couvrant 10 catégories de sécurité (gestion des secrets, validation des entrées, prévention des injections SQL, XSS, CSRF, etc.) avec des exemples de code TypeScript montrant à la fois les mauvaises pratiques (FAIL) et les bonnes pratiques (PASS). L'outil inclut des vérifications post-déploiement et des tests automatisés, ainsi que des ressources vers OWASP et les documentations Next.js/Supabase. Elle s'applique particulièrement aux stacks Next.js, Supabase, Solana pour la blockchain, et recommande des mesures comme les variables d'environnement, cookies HttpOnly, tokens CSRF, et limitation de débit. Une fois activée, l'agent doit parcourir chaque section et exécuter les vérifications mentionnées pour garantir que le code respecte les normes de sécurité avant tout déploiement en production.

Compatible avec~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/security-review

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Compétence de révision de sécurité

Cette compétence garantit que tout code respecte les bonnes pratiques de sécurité et identifie les vulnérabilités potentielles.

Quand activer

  • Implémentation d'authentification ou d'autorisation
  • Traitement de saisie utilisateur ou téléversements de fichiers
  • Création de nouveaux points d'accès API
  • Travail avec des secrets ou des identifiants
  • Implémentation de fonctionnalités de paiement
  • Stockage ou transmission de données sensibles
  • Intégration d'API tierces

Checklist de sécurité

1. Gestion des secrets

ÉCHEC : NE JAMAIS faire ça

const apiKey = "sk-proj-xxxxx"  // Secret codé en dur
const dbPassword = "password123" // Dans le code source

RÉUSSI : TOUJOURS faire ça

const apiKey = process.env.OPENAI_API_KEY
const dbUrl = process.env.DATABASE_URL

// Vérifier que les secrets existent
if (!apiKey) {
  throw new Error('OPENAI_API_KEY non configuré')
}

Étapes de vérification

  • Pas de clés API, jetons ou mots de passe codés en dur
  • Tous les secrets dans des variables d'environnement
  • .env.local dans .gitignore
  • Aucun secret dans l'historique Git
  • Secrets de production sur la plateforme d'hébergement (Vercel, Railway)

2. Validation des entrées

Toujours valider les entrées utilisateur

import { z } from 'zod'

// Définir le schéma de validation
const CreateUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(1).max(100),
  age: z.number().int().min(0).max(150)
})

// Valider avant traitement
export async function createUser(input: unknown) {
  try {
    const validated = CreateUserSchema.parse(input)
    return await db.users.create(validated)
  } catch (error) {
    if (error instanceof z.ZodError) {
      return { success: false, errors: error.issues }
    }
    throw error
  }
}

Validation des téléversements de fichiers

function validateFileUpload(file: File) {
  // Vérification de la taille (5 Mo max)
  const maxSize = 5 * 1024 * 1024
  if (file.size > maxSize) {
    throw new Error('Fichier trop volumineux (max 5 Mo)')
  }

  // Vérification du type
  const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
  if (!allowedTypes.includes(file.type)) {
    throw new Error('Type de fichier invalide')
  }

  // Vérification de l'extension
  const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif']
  const extension = file.name.toLowerCase().match(/\.\.[^.]+$/)?.[0]
  if (!extension || !allowedExtensions.includes(extension)) {
    throw new Error('Extension de fichier invalide')
  }

  return true
}

Étapes de vérification

  • Toutes les entrées utilisateur validées avec des schémas
  • Téléversements de fichiers restreints (taille, type, extension)
  • Aucune utilisation directe de l'entrée utilisateur dans les requêtes
  • Validation par liste blanche (pas par liste noire)
  • Les messages d'erreur ne divulguent pas d'informations sensibles

3. Prévention des injections SQL

ÉCHEC : NE JAMAIS concaténer du SQL

// DANGEREUX - vulnérabilité aux injections SQL
const query = `SELECT * FROM users WHERE email = '${userEmail}'`
await db.query(query)

RÉUSSI : TOUJOURS utiliser des requêtes paramétrées

// Sûr - requête paramétrée
const { data } = await supabase
  .from('users')
  .select('*')
  .eq('email', userEmail)

// Ou avec du SQL brut
await db.query(
  'SELECT * FROM users WHERE email = $1',
  [userEmail]
)

Étapes de vérification

  • Toutes les requêtes de base de données utilisent des requêtes paramétrées
  • Aucune concaténation de chaînes dans le SQL
  • ORM/constructeur de requêtes utilisé correctement
  • Requêtes Supabase correctement nettoyées

4. Authentification et autorisation

Gestion des jetons JWT

// ÉCHEC : MAUVAIS : localStorage (vulnérable au XSS)
localStorage.setItem('token', token)

// RÉUSSI : CORRECT : cookies httpOnly
res.setHeader('Set-Cookie',
  `token=${token}; HttpOnly; Secure; SameSite=Strict; Max-Age=3600`)

Vérifications d'autorisation

export async function deleteUser(userId: string, requesterId: string) {
  // TOUJOURS vérifier l'autorisation en premier
  const requester = await db.users.findUnique({
    where: { id: requesterId }
  })

  if (requester.role !== 'admin') {
    return NextResponse.json(
      { error: 'Non autorisé' },
      { status: 403 }
    )
  }

  // Procéder à la suppression
  await db.users.delete({ where: { id: userId } })
}

Sécurité au niveau des lignes (Supabase)

-- Activer RLS sur toutes les tables
ALTER TABLE users ENABLE ROW LEVEL SECURITY;

-- Les utilisateurs ne peuvent voir que leurs propres données
CREATE POLICY "Les utilisateurs voient leurs propres données"
  ON users FOR SELECT
  USING (auth.uid() = id);

-- Les utilisateurs ne peuvent modifier que leurs propres données
CREATE POLICY "Les utilisateurs modifient leurs propres données"
  ON users FOR UPDATE
  USING (auth.uid() = id);

Étapes de vérification

  • Jetons stockés dans des cookies httpOnly (pas localStorage)
  • Vérifications d'autorisation avant les opérations sensibles
  • Sécurité au niveau des lignes activée dans Supabase
  • Contrôle d'accès basé sur les rôles implémenté
  • Gestion de session sécurisée

5. Prévention XSS

Nettoyer le HTML

import DOMPurify from 'isomorphic-dompurify'

// TOUJOURS nettoyer le HTML fourni par l'utilisateur
function renderUserContent(html: string) {
  const clean = DOMPurify.sanitize(html, {
    ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
    ALLOWED_ATTR: []
  })
  return <div dangerouslySetInnerHTML={{ __html: clean }} />
}

Politique de sécurité du contenu

Commencez strict et n'assouplissez qu'avec un plan de retrait documenté. N'utilisez pas par défaut 'unsafe-inline' ou 'unsafe-eval' ; ils neutralisent une grande partie de la protection CSP et doivent être traités comme une dette de compatibilité temporaire.

// next.config.js
const securityHeaders = [
  {
    key: 'Content-Security-Policy',
    value: `
      default-src 'self';
      base-uri 'self';
      object-src 'none';
      frame-ancestors 'none';
      script-src 'self';
      style-src 'self';
      img-src 'self' data: https:;
      font-src 'self';
      connect-src 'self' https://api.example.com;
    `.replace(/\s{2,}/g, ' ').trim()
  }
]

Étapes de vérification

  • HTML fourni par l'utilisateur nettoyé
  • En-têtes CSP configurés
  • Aucun rendu de contenu dynamique non validé
  • Protection XSS intégrée de React utilisée

6. Protection CSRF

Jetons CSRF

import { csrf } from '@/lib/csrf'

export async function POST(request: Request) {
  const token = request.headers.get('X-CSRF-Token')

  if (!csrf.verify(token)) {
    return NextResponse.json(
      { error: 'Jeton CSRF invalide' },
      { status: 403 }
    )
  }

  // Traiter la demande
}

Cookies SameSite

res.setHeader('Set-Cookie',
  `session=${sessionId}; HttpOnly; Secure; SameSite=Strict`)

Étapes de vérification

  • Jetons CSRF sur les opérations modifiant l'état
  • SameSite=Strict sur tous les cookies
  • Modèle de cookie à double soumission implémenté

7. Limitation de débit

Limitation de débit API

import rateLimit from 'express-rate-limit'

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100, // 100 requêtes par fenêtre
  message: 'Trop de requêtes'
})

// Appliquer aux routes
app.use('/api/', limiter)

Opérations coûteuses

// Limitation de débit agressive pour les recherches
const searchLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 10, // 10 requêtes par minute
  message: 'Trop de demandes de recherche'
})

app.use('/api/search', searchLimiter)

Étapes de vérification

  • Limitation de débit sur tous les points d'accès API
  • Limites plus strictes sur les opérations coûteuses
  • Limitation de débit basée sur l'IP
  • Limitation de débit basée sur l'utilisateur (authentifié)

8. Exposition de données sensibles

Journalisation

// ÉCHEC : MAUVAIS : Journalisation de données sensibles
console.log('Connexion utilisateur:', { email, password })
console.log('Paiement:', { cardNumber, cvv })

// RÉUSSI : CORRECT : Masquer les données sensibles
console.log('Connexion utilisateur:', { email, userId })
console.log('Paiement:', { last4: card.last4, userId })

Messages d'erreur

// ÉCHEC : MAUVAIS : Exposition de détails internes
catch (error) {
  return NextResponse.json(
    { error: error.message, stack: error.stack },
    { status: 500 }
  )
}

// RÉUSSI : CORRECT : Messages d'erreur génériques
catch (error) {
  console.error('Erreur interne:', error)
  return NextResponse.json(
    { error: 'Une erreur est survenue. Veuillez réessayer.' },
    { status: 500 }
  )
}

Étapes de vérification

  • Aucun mot de passe, jeton ou secret dans les journaux
  • Messages d'erreur génériques pour les utilisateurs
  • Erreurs détaillées uniquement dans les journaux serveur
  • Aucune trace de pile exposée aux utilisateurs

9. Sécurité blockchain (Solana)

Vérification de portefeuille

import { verify } from '@solana/web3.js'

async function verifyWalletOwnership(
  publicKey: string,
  signature: string,
  message: string
) {
  try {
    const isValid = verify(
      Buffer.from(message),
      Buffer.from(signature, 'base64'),
      Buffer.from(publicKey, 'base64')
    )
    return isValid
  } catch (error) {
    return false
  }
}

Vérification de transaction

async function verifyTransaction(transaction: Transaction) {
  // Vérifier le destinataire
  if (transaction.to !== expectedRecipient) {
    throw new Error('Destinataire invalide')
  }

  // Vérifier le montant
  if (transaction.amount > maxAmount) {
    throw new Error('Montant dépasse la limite')
  }

  // Vérifier que l'utilisateur a un solde suffisant
  const balance = await getBalance(transaction.from)
  if (balance < transaction.amount) {
    throw new Error('Solde insuffisant')
  }

  return true
}

Étapes de vérification

  • Signatures de portefeuille vérifiées
  • Détails de transaction validés
  • Vérifications de solde avant les transactions
  • Aucune signature de transaction aveugle

10. Sécurité des dépendances

Mises à jour régulières

# Vérifier les vulnérabilités
npm audit

# Corriger les problèmes corrigeables automatiquement
npm audit fix

# Mettre à jour les dépendances
npm update

# Vérifier les paquets obsolètes
npm outdated

Fichiers de verrouillage

# TOUJOURS valider les fichiers de verrouillage
git add package-lock.json

# Utiliser en CI/CD pour des builds reproductibles
npm ci  # Au lieu de npm install

Étapes de vérification

  • Dépendances à jour
  • Aucune vulnérabilité connue (npm audit propre)
  • Fichiers de verrouillage validés
  • Dependabot activé sur GitHub
  • Mises à jour de sécurité régulières

Tests de sécurité

Tests de sécurité automatisés

// Tester l'authentification
test('nécessite une authentification', async () => {
  const response = await fetch('/api/protected')
  expect(response.status).toBe(401)
})

// Tester l'autorisation
test('nécessite le rôle admin', async () => {
  const response = await fetch('/api/admin', {
    headers: { Authorization: `Bearer ${userToken}` }
  })
  expect(response.status).toBe(403)
})

// Tester la validation des entrées
test('rejette l'entrée invalide', async () => {
  const response = await fetch('/api/users', {
    method: 'POST',
    body: JSON.stringify({ email: 'pas-un-email' })
  })
  expect(response.status).toBe(400)
})

// Tester la limitation de débit
test('applique les limites de débit', async () => {
  const requests = Array(101).fill(null).map(() =>
    fetch('/api/endpoint')
  )

  const responses = await Promise.all(requests)
  const tooManyRequests = responses.filter(r => r.status === 429)

  expect(tooManyRequests.length).toBeGreaterThan(0)
})

Checklist de sécurité avant déploiement

Avant TOUT déploiement en production :

  • Secrets : Aucun secret codé en dur, tous dans des variables d'environnement
  • Validation des entrées : Toutes les entrées utilisateur validées
  • Injections SQL : Toutes les requêtes paramétrées
  • XSS : Contenu utilisateur nettoyé
  • CSRF : Protection activée
  • Authentification : Gestion appropriée des jetons
  • Autorisation : Vérifications de rôle en place
  • Limitation de débit : Activée sur tous les points d'accès
  • HTTPS : Appliqué en production
  • En-têtes de sécurité : CSP, X-Frame-Options configurés
  • Gestion des erreurs : Aucune donnée sensible dans les erreurs
  • Journalisation : Aucune donnée sensible journalisée
  • Dépendances : À jour, sans vulnérabilités
  • Sécurité au niveau des lignes : Activée dans Supabase
  • CORS : Correctement configuré
  • Téléversements de fichiers : Validés (taille, type)
  • Signatures de portefeuille : Vérifiées (si blockchain)

Ressources


Rappelez-vous : La sécurité n'est pas facultative. Une seule vulnérabilité peut compromettre l'ensemble de la plateforme. En cas de doute, privilégiez la prudence.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Skills associés