ScanVibeScanVibe
·8 min read·ScanVibe Team

API Keys exposées : la vulnérabilité n°1 des apps construites par l'IA

api-keyssecurityvibe-coding

API Keys exposées : la vulnérabilité n°1 des apps construites par l'IA

Lorsque nous scannons des apps construites avec des outils de coding IA, une vulnérabilité apparaît dans plus de 60 % d'entre elles : des API keys exposées dans le JavaScript frontend.

Ce n'est pas un risque théorique. Les clés exposées entraînent des conséquences réelles : accès non autorisé aux bases de données, factures cloud astronomiques, fuites de données et prises de contrôle de comptes. Et cela se produit à grande échelle parce que les outils de coding IA intègrent des secrets dans le code côté client par défaut.

60%+ des apps construites par l'IA que nous scannons ont des API keys exposées dans leur JavaScript frontend

Pourquoi les outils IA exposent vos clés

Quand vous demandez à Lovable d'« ajouter l'auth Supabase » ou que vous dites à Cursor de « connecter mon projet Firebase », l'IA fait ce que vous avez demandé — elle écrit du code qui fonctionne. Mais « fonctionnel » ne signifie pas « sécurisé ».

Voici ce qui se passe généralement :

  1. L'IA place les clés là où le code en a besoin — en général dans un fichier de configuration frontend ou directement dans le code d'un composant
  2. L'app fonctionne, donc le développeur la déploie
  3. Les clés se retrouvent dans le bundle JavaScript, visibles par quiconque ouvre les DevTools
L'IA n'agit pas de manière malveillante. Elle optimise pour « faire fonctionner », pas pour « sécuriser ». Et la plupart des vibe coders — surtout les débutants — ne connaissent pas la différence entre une clé publique et une clé secrète.

Quelles clés sont exposées ?

Nous catégorisons les clés exposées par niveau de sévérité :

Critical Action immédiate requise

Supabase service_role key
Contournement complet de la base de données. Lecture/écriture/suppression de tout.
Critical
Stripe Secret Key (sk_live_...)
Création de paiements, remboursements, accès aux données clients.
Critical
Database connection strings
Accès direct à la base de données, sans protection par couche API.
Critical
AWS Secret Access Keys
Accès aux buckets S3, fonctions Lambda et ressources cloud.
Critical
SendGrid / Resend API keys
Envoi d'emails depuis votre domaine. Vecteur potentiel de phishing.
Critical

High À corriger rapidement

Firebase Admin SDK credentials
Contournement des règles de sécurité, accès complet à Firestore/RTDB.
High
OpenAI / Anthropic API keys
Appels API à vos frais. Des factures de plus de 1000 $ ont été signalées.
High
Twilio Auth Tokens
Envoi de SMS et appels téléphoniques sur votre compte.
High

Low Risk Généralement sans risque en frontend

Supabase anon key
Conçue pour le frontend, protégée par les RLS (si activées).
Low
Firebase apiKey
Un identifiant de projet, pas un secret (souvent confondu avec un secret).
Low
Stripe Publishable Key (pk_live_...)
Conçue pour une utilisation frontend avec Stripe.js.
Low
Google Maps API Key
Sans risque si restreinte à votre domaine dans la Google Cloud Console.
Low

Comment détecter les clés exposées

Vérification manuelle

Ouvrez votre app déployée, puis :

  1. Ouvrez les DevTools (F12)
  2. Allez dans l'onglet Sources
  3. Recherchez (Ctrl+Shift+F) des patterns comme :
sk_live_ Stripe secret
service_role Supabase admin
AKIA AWS access key
sk- OpenAI key
SG. SendGrid key
eyJhb JWT / Supabase key

Si vous trouvez des clés critiques, effectuez une rotation immédiatement.

Vérification automatisée

L'analyseur de secrets de ScanVibe scanne les bundles JavaScript de votre app, le code source HTML et les requêtes réseau pour détecter plus de 30 patterns de credentials exposées. Un seul scan couvre l'ensemble.


Comment corriger le problème

La correction dépend de votre framework, mais le principe reste toujours le même : les secrets vont sur le serveur, jamais dans le navigateur.

Next.js

# .env.local

# PUBLIC — safe for browser (no secret access)
NEXT_PUBLIC_SUPABASE_URL=https://abc.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhb...public

# PRIVATE — server-side only
SUPABASE_SERVICE_ROLE_KEY=eyJhb...secret
STRIPE_SECRET_KEY=sk_live_...
OPENAI_API_KEY=sk-...
Dans Next.js, seules les variables préfixées par NEXT_PUBLIC_ sont incluses dans le bundle navigateur. Tout le reste reste côté serveur.

Pour les appels API nécessitant des clés secrètes

Créez une route API côté serveur :

// app/api/generate/route.ts (server-side)
import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY, // Never in browser
});

export async function POST(request: Request) {
  const { prompt } = await request.json();

  const response = await openai.chat.completions.create({
    model: 'gpt-4',
    messages: [{ role: 'user', content: prompt }],
  });

  return Response.json({ result: response.choices[0].message.content });
}

Puis appelez-la depuis votre frontend :

// Client-side — no API key needed
const response = await fetch('/api/generate', {
  method: 'POST',
  body: JSON.stringify({ prompt: 'Hello' }),
});

Vite / React (sans Next.js)

# Only VITE_ prefix vars go to the browser
VITE_SUPABASE_URL=https://abc.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhb...public

# These stay server-side (use in a backend)
SUPABASE_SERVICE_ROLE_KEY=eyJhb...secret
Si vous utilisez une SPA React pure sans backend, vous devez en ajouter un (même un simple serveur Express ou un Cloudflare Worker) pour toute operation nécessitant des clés secrètes.

Que faire si vos clés sont déjà exposées

Si vous avez découvert des clés exposées en production :

  1. Effectuez une rotation de la clé immédiatement. Générez-en une nouvelle depuis le tableau de bord du service.
  2. Vérifiez les utilisations non autorisées. Consultez les tableaux de bord de facturation, les logs API et les journaux d'audit de la base de données.
  3. Mettez à jour votre code pour utiliser la nouvelle clé uniquement côté serveur.
  4. Vérifiez l'historique git. Si la clé a un jour été commitée dans un repository, considérez l'ancienne clé comme définitivement compromise — même si vous l'avez supprimée dans un commit ultérieur.
  5. Utilisez .gitignore pour exclure les fichiers .env du contrôle de version.

Où effectuer la rotation des clés

Supabase
Settings → API → Generate new keys
Stripe
Developers → API keys → Roll key
OpenAI
API keys → Create new secret key
Firebase
Project settings → Service accounts
AWS
IAM → Users → Security credentials
SendGrid
Settings → API Keys → Create key

Prévention : bloquez les fuites avant le déploiement

🔒
5 étapes pour protéger vos secrets :

1. Utilisez ScanVibe pour scanner chaque déploiement. Nous détectons les clés exposées avant les attaquants.
2. Ajoutez un pre-commit hook avec des outils comme gitleaks ou trufflehog pour intercepter les secrets dans les commits.
3. Relisez le code généré par l'IA avant de le déployer. Vérifiez la présence de chaînes en dur qui ressemblent à des clés.
4. Formez votre équipe sur la différence entre clés publiques et clés secrètes.
5. Utilisez la validation des variables d'environnement pour vous assurer que les variables côté serveur sont bien définies.
// lib/env.ts
function requireEnv(name: string): string {
  const value = process.env[name];
  if (!value) throw new Error(`Missing env var: ${name}`);
  return value;
}

export const env = {
  stripeSecret: requireEnv('STRIPE_SECRET_KEY'),
  supabaseServiceRole: requireEnv('SUPABASE_SERVICE_ROLE_KEY'),
};

En résumé

Les outils de coding IA sont formidables pour livrer rapidement. Mais ils ne pensent pas à la sécurité — ils pensent à faire fonctionner votre code. La première chose que vous pouvez faire pour sécuriser votre app construite par l'IA est de vous assurer que vos secrets restent sur le serveur.

5 min pour corriger des clés exposées. Des mois pour se remettre d'une fuite de données.

Articles connexes

Articles similaires

Scannez votre app maintenant

Vérifiez la sécurité de votre app construite avec l'IA en quelques secondes. Gratuit, sans inscription.

Lancer un scan