Communitygithub.com

security-review

Compétence d'analyse de sécurité pour le code : authentification, entrées utilisateur, secrets, endpoints API et fonctionnalités sensibles.

Qu'est-ce que security-review ?

Cette compétence fournit une checklist complète de sécurité et des modèles de code pour les développeurs travaillant avec des API, de l'authentification, des entrées utilisateur, des secrets, des paiements ou des fonctionnalités blockchain. Elle couvre les catégories suivantes : gestion des secrets, validation des entrées, prévention des injections SQL, gestion des tokens JWT et des cookies httpOnly, prévention XSS avec DOMPurify, protection CSRF via tokens et cookies SameSite, limitation de débit (rate limiting), exposition de données sensibles (journalisation et messages d'erreur), sécurité blockchain (vérification de portefeuille et de transaction), et sécurité des dépendances (npm audit, mise à jour régulière). La compétence propose à la fois des exemples 'FAIL' (à ne pas faire) et 'PASS' (à faire) pour chaque catégorie, ainsi que des tests de sécurité automatisés et une checklist pré-déploiement. Les plateformes cibles incluent Next.js, Supabase, Solana et les frameworks web standards. L'utilisateur active cette compétence lorsqu'il implémente des fonctionnalités sensibles ou expose des endpoints publics.

Compatible avec~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/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 d'Analyse de Sécurité

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

Quand l'activer

  • Implémentation d'authentification ou d'autorisation
  • Gestion des entrées utilisateur ou des téléchargements de fichiers
  • Création de nouveaux endpoints 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 Ceci

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

RÉUSSITE : TOUJOURS Faire Ceci

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

  • Aucune clé API, token ou mot de passe codé en dur
  • Tous les secrets dans des variables d'environnement
  • .env.local dans .gitignore
  • Aucun secret dans l'historique Git
  • Secrets de production dans 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
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échargements de Fichiers

function validateFileUpload(file: File) {
  // Vérification de la taille (max 5 Mo)
  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échargements 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é d'injection SQL
const query = `SELECT * FROM users WHERE email = '${userEmail}'`
await db.query(query)

RÉUSSITE : 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 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 assainies

4. Authentification et Autorisation

Gestion des Tokens JWT

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

// RÉUSSITE : 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 d'abord
  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 mettre à jour que leurs propres données
CREATE POLICY "Les utilisateurs mettent à jour leurs propres données"
  ON users FOR UPDATE
  USING (auth.uid() = id);

Étapes de Vérification

  • Tokens 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

Assainir le HTML

import DOMPurify from 'isomorphic-dompurify'

// TOUJOURS assainir 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 (CSP)

Commencez de manière stricte et assouplissez uniquement avec un plan de suppression documenté. Ne définissez 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 assaini
  • 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

Tokens 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: 'Token CSRF invalide' },
      { status: 403 }
    )
  }

  // Traiter la requête
}

Cookies SameSite

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

Étapes de Vérification

  • Tokens 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 d'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 agressive pour les recherches
const searchLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 10, // 10 requêtes par minute
  message: 'Trop de requêtes de recherche'
})

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

Étapes de Vérification

  • Limitation de débit sur tous les endpoints 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ÉUSSITE : 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ÉUSSITE : 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, token 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 du 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 la 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 automatiquement corrigeables
npm audit fix

# Mettre à jour les dépendances
npm update

# Vérifier les packages obsolètes
npm outdated

Fichiers de Verrouillage

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

# Utiliser dans 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 une 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
  • Injection SQL : Toutes les requêtes paramétrées
  • XSS : Contenu utilisateur assaini
  • CSRF : Protection activée
  • Authentification : Gestion appropriée des tokens
  • Autorisation : Vérifications de rôles en place
  • Limitation de Débit : Activée sur tous les endpoints
  • 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échargements de Fichiers : Validés (taille, type)
  • Signatures de Portefeuille : Vérifiées (si blockchain)

Ressources


Souvenez-vous : La sécurité n'est pas optionnelle. 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/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

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.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills associés