Carte du code
D'où viennent les données, par quelles fonctions elles passent et où elles arrivent. Les problèmes sont placés dans la fonction où ils apparaissent ; choisissez-en un pour ne garder que son chemin.
Choisissez un problème
La carte garde alors seulement son chemin : l'entrée d'où viennent les données, les fonctions traversées et l'endroit où elles arrivent.
Clé secrète Stripe dans le code
3const stripe = new Stripe("sk_l****")
- Problème iciconst stripe = new Stripe("sk_l****"), src/lib/stripe.ts:3
Avec cette clé, n'importe qui peut créer des paiements, des remboursements et lire vos clients.
Révoquez la clé dans le tableau de bord Stripe, puis lisez-la depuis une variable d'environnement côté serveur.
Table Supabase sans RLS
1create table orders (id uuid primary key, items jsonb, email text);
- Problème icicreate table orders (id uuid primary key, items jsonb, email text);, supabase/migrations/003_orders.sql:1
- UtiliseBase de données
Sans Row Level Security, la clé anon publique de votre application suffit pour lire et modifier toute la table.
Ajoutez « alter table … enable row level security; » puis des règles qui limitent chaque ligne à son propriétaire (auth.uid()).
RLS désactivée sur une table
2alter table orders disable row level security;
- Problème icialter table orders disable row level security;, supabase/migrations/003_orders.sql:2
- UtiliseBase de données
La table redevient lisible et modifiable par tout le monde avec la clé anon.
Supprimez cette ligne et activez RLS avec des règles par utilisateur.
Requête SQL construite avec du texte de l'utilisateur
4const res = await pool.query(`SELECT * FROM products WHERE name LIKE '%${q}%'`)
- EntréeGET /api/search (query: q)
- Passe parGET(request), src/app/api/search/route.ts:3
- Problème icisearchProducts(q), src/lib/products.ts:4
- UtiliseBase de données
Si une valeur vient de l'utilisateur, il peut lire ou effacer la base (injection SQL).
Utilisez des paramètres (%s, ?, $1) ou l'ORM au lieu de coller les valeurs dans la requête.
Carte construite par lecture du code (Python, JavaScript et TypeScript), sans l'exécuter : un appel dynamique ou un décorateur peut lui échapper. Seuls les noms des fonctions, des routes et les numéros de ligne sont gardés.
Avec cette clé, n'importe qui peut créer des paiements, des remboursements et lire vos clients.
Révoquez la clé dans le tableau de bord Stripe, puis lisez-la depuis une variable d'environnement côté serveur.
1 endroit dans le code
src/lib/stripe.ts:3const stripe = new Stripe("sk_l****")
Voir le prompt
Dans src/lib/stripe.ts:3 : Clé secrète Stripe dans le code. Révoquez la clé dans le tableau de bord Stripe, puis lisez-la depuis une variable d'environnement côté serveur. Corrige seulement ces endroits, puis explique-moi le changement.
Sans Row Level Security, la clé anon publique de votre application suffit pour lire et modifier toute la table.
Ajoutez « alter table … enable row level security; » puis des règles qui limitent chaque ligne à son propriétaire (auth.uid()).
1 endroit dans le code
supabase/migrations/003_orders.sql:1create table orders (id uuid primary key, items jsonb, email text);
Voir le prompt
Dans supabase/migrations/003_orders.sql:1 : Table Supabase sans RLS. Ajoutez « alter table … enable row level security; » puis des règles qui limitent chaque ligne à son propriétaire (auth.uid()). Corrige seulement ces endroits, puis explique-moi le changement.
La table redevient lisible et modifiable par tout le monde avec la clé anon.
Supprimez cette ligne et activez RLS avec des règles par utilisateur.
1 endroit dans le code
supabase/migrations/003_orders.sql:2alter table orders disable row level security;
Voir le prompt
Dans supabase/migrations/003_orders.sql:2 : RLS désactivée sur une table. Supprimez cette ligne et activez RLS avec des règles par utilisateur. Corrige seulement ces endroits, puis explique-moi le changement.
Si une valeur vient de l'utilisateur, il peut lire ou effacer la base (injection SQL).
Utilisez des paramètres (%s, ?, $1) ou l'ORM au lieu de coller les valeurs dans la requête.
1 endroit dans le code
src/lib/products.ts:4const res = await pool.query(`SELECT * FROM products WHERE name LIKE '%${q}%'`)Donnée envoyée par l'utilisateur dans src/app/api/search/route.ts:4, transmise par searchProducts (src/app/api/search/route.ts:5), utilisée ici sans contrôle.
Voir le prompt
Dans src/lib/products.ts:4 : Requête SQL construite avec du texte de l'utilisateur. Utilisez des paramètres (%s, ?, $1) ou l'ORM au lieu de coller les valeurs dans la requête. Corrige seulement ces endroits, puis explique-moi le changement.
Ce que vérifie l'analyse du code
Les clés et mots de passe écrits dans le code (Stripe, AWS, GitHub, GitLab, OpenAI, Anthropic, Hugging Face, SendGrid, Slack, Telegram, Google, jetons npm et PyPI, adresses de base de données avec mot de passe, clés privées, fichiers .env), la clé secrète de l'application écrite en dur, les secrets exposés au navigateur (NEXT_PUBLIC_, VITE_…), la clé service_role de Supabase côté navigateur, les tables Supabase sans RLS ou avec des règles ouvertes (sur toutes les migrations du projet), les règles Firebase ouvertes ou en « mode test », les vues et fonctions Supabase qui contournent RLS, les requêtes SQL et les commandes système construites avec du texte, les requêtes, fichiers et redirections choisis par l'utilisateur (aussi quand la valeur passe par une variable quelques lignes plus haut), les données enregistrées sans choisir les champs, le chargement de données qui peut exécuter du code, les mots de passe hachés en MD5 ou comparés à une valeur fixe, la protection CSRF ou les cookies de session affaiblis, les jetons dans localStorage ou tirés avec Math.random, le debug activé, la vérification TLS ou JWT désactivée, CORS ouvert avec identifiants et le HTML inséré sans nettoyage. Les valeurs d'exemple (your-key, xxxx), les mots de passe locaux par défaut, les commentaires, les tests et les configurations de test ne sont pas signalés, sauf pour les secrets.
Dans un projet, l'analyse note aussi quels paquets sont importés dans le code : une faille dans un paquet que le code n'importe jamais, et dont aucun autre paquet n'a besoin d'après le fichier de verrouillage, descend d'un niveau, avec la raison. Les fichiers de dépendances trouvés (package-lock.json, requirements.txt, composer.lock…) donnent directement une nouvelle version de l'analyse des dépendances.
Le code est lu en mémoire puis oublié : Tamiso garde seulement le nom du fichier, la ligne et un court extrait où les secrets sont masqués. Les dossiers de dépendances et de build (node_modules, dist…) sont ignorés. Une analyse par règles ne remplace pas une revue de sécurité.
Comment ça marche
Des règles pour les erreurs fréquentes
Secrets, Supabase et Firebase, injections SQL, redirections ouvertes, mode debug laissé actif. Chaque règle a son identifiant CWE et sa correction en une phrase.
La carte du code
D'où viennent les données (routes, scripts), par quelles fonctions elles passent et où elles arrivent : base de données, e-mails, fichiers, services externes. Chaque problème est placé sur son chemin.
Le code n'est pas gardé
L'archive est lue en mémoire, puis oubliée. Tamiso garde le fichier, la ligne, la règle et un court extrait avec le secret masqué.