SÉCU

3 vérifs avant de mettre ton appli en ligne.

Avec l'IA, tu sors un prototype en un week-end. Le mettre devant des vrais clients, c'est une autre étape : voici ma checklist.

À la fin

Tes tables protégées, aucun mot de passe dans ton code, et des formulaires fermés aux robots.

45 minIntermédiaire

1fichier pour Claude

Outils

SupabaseGitleaksTurnstile

Le pas à pas est gratuit, en entier. Ton e-mail débloque le fichier à donner à Claude, prêt à copier ou à télécharger.

Le principe

Comment ça marche.

Un prototype fait avec l'IA marche souvent du premier coup. Mais trois portes restent fréquemment ouvertes : la base de données, les codes d'accès dans le code, et les formulaires. Ces trois vérifs les ferment.

Ton prototypefait avec l'IA
3 vérifs
  • Qui lit tes données
  • Tes codes d'accès
  • Les robots
En lignedevant des vrais clients
Le minimum avant d'ouvrir à des clients. Ce n'est pas un audit complet.

Coche au fur et à mesure

La checklist.

0 / 8 fait

Supabase

1. Qui peut lire tes données ?

Sur Supabase, une table d'un schéma exposé sans règles d'accès (RLS) peut être lue et modifiée par quiconque a ta clé publique. Et cette clé est dans ton site.

Documentation Supabase : une table d'un schéma exposé sans RLS est lisible et modifiable
La doc officielle de Supabase le dit en encadré : sans RLS, la table est lisible et modifiable.
  1. Ouvre le Security Advisor.

    Dans ton projet : menu Advisors, puis Security Advisor.

    Tu dois voir la liste des alertes. Cherche rls_disabled_in_public et policy_exists_rls_disabled.

  2. Active la RLS et écris les règles.

    Dans le SQL Editor, pour chaque table signalée :

    -- 1. Activer la RLS sur une table (SQL Editor de Supabase)
    alter table public.ma_table enable row level security;
    
    -- 2. Ouvrir seulement ce qu'il faut : chaque utilisateur connecté lit ses propres lignes
    create policy "Chacun lit ses lignes"
    on public.ma_table
    for select
    to authenticated
    using ( (select auth.uid()) = user_id );
    Piège
    RLS activée sans aucune règle = plus personne ne lit la table depuis le site. C'est voulu : tu ouvres ensuite seulement ce qu'il faut. Le guide des règles.
  3. Teste avec un compte qui n'a pas le droit.

    Connecte-toi avec un deuxième compte et essaie de lire les données du premier.

    Tu dois voir une liste vide ou une erreur. Jamais les données de l'autre compte.

Gitleaks

2. Tes codes d'accès sont-ils dans ton code ?

Quand l'IA écrit ton appli, elle laisse parfois une clé d'API ou un mot de passe en clair. Une fois poussé sur GitHub, il reste dans l'historique même si tu l'effaces ensuite. Gitleaks (gratuit, open source) les cherche pour toi.

  1. Installe Gitleaks.

    Mac : brew install gitleaks. Windows : le binaire de la page Releases du projet.

  2. Lance-le à la racine du projet.

    # tout l'historique du dépôt git
    gitleaks git -v
    
    # un dossier, même sans git
    gitleaks dir -v .

    Tu dois voir « no leaks found », ou une fiche par fuite : le secret, le fichier, la ligne, le commit.

    Exemple de sortie de Gitleaks : Finding, File, Line, Commit, Fingerprint
    À quoi ressemble une fuite trouvée (exemple du README officiel).
  3. Change chaque clé trouvée.

    Chez le fournisseur (Stripe, OpenAI, Supabase…), crée une nouvelle clé et supprime l'ancienne. Range la nouvelle dans les variables d'environnement de ton hébergeur, jamais dans le code.

    Piège
    Effacer la clé du code ne suffit pas : elle a déjà fuité dans l'historique. Seul le changement de clé la rend inutile.

Cloudflare Turnstile

3. Les robots remplissent-ils tes formulaires ?

Sans protection, un robot peut envoyer des milliers de fois ton formulaire d'inscription ou de contact. Cloudflare Turnstile ajoute une case anti-robot, gratuite sur le plan Free.

  1. Crée un widget.

    Tableau de bord Cloudflare, menu Turnstile, ajoute ton domaine.

    Tu dois voir une sitekey (publique) et une clé secrète.

  2. Pose la case dans ton formulaire.

    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
    
    <form action="/envoi" method="POST">
      <!-- ... tes champs ... -->
      <div class="cf-turnstile" data-sitekey="TA_SITEKEY"></div>
      <button type="submit">Envoyer</button>
    </form>
    Démo officielle de Cloudflare Turnstile : formulaire de connexion avec la case Success
    La case dans un formulaire de démo de Cloudflare.
  3. Vérifie le jeton côté serveur.

    // Côté serveur, à la réception du formulaire (Node.js 18+)
    const reponse = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", {
      method: "POST",
      body: new URLSearchParams({
        secret: process.env.TURNSTILE_SECRET_KEY, // jamais dans le code du site
        response: jetonRecuDuFormulaire,          // champ cf-turnstile-response
      }),
    });
    const { success } = await reponse.json();
    if (!success) {
      // refuse l'envoi
    }
    Piège
    Sans cette vérification, la case ne protège rien : un robot envoie le formulaire sans passer par elle. Détails dans la doc siteverify.

Pour Claude Code ou Cursor

À donner à Claude.

Pour toi

Tu sais maintenant quoi chercher. Mais sur un gros projet, relire chaque fichier prend des heures.

Pour Claude

Claude lit tout le projet et te rend un tableau. Il ne modifie rien : tu décides des corrections.

audit-securite.md20 lignes

Le fichier complet, prêt à copier ou à télécharger, s'ouvre avec ton e-mail.

FAQ

Questions.

Je n'utilise pas Supabase.

La question reste la même : qui peut lire tes données sans être connecté ? Firebase a ses règles de sécurité, une base classique a ses droits d'accès côté serveur.

Ma clé Supabase « anon » est visible dans le site, c'est grave ?

Non, elle est faite pour ça, à condition que la RLS protège tes tables. La clé service_role, elle, ne doit jamais y être.

C'est suffisant pour être en sécurité ?

Non. C'est le minimum avant d'ouvrir à des clients, pas un audit complet.

30 min pour cartographier vos goulotsGratuit, sans engagement
Réserver un appel