// docs / security guides / cursor checklist
Cursor security checklist: 25 items before ship
Building with Cursor? Cursor's autocomplete and Agent features are exceptionally powerful — and create predictable security blind spots. This checklist targets Cursor-specific patterns: service-role key inlining, generated multi-file edits merged without review, Agent-mode terminal commands, and project rules (.cursor/rules) as your first security guardrail. 25 items across secrets, database, auth, headers, deployment, and Cursor-specific gotchas.
PRE = pre-deploy (audit your source). DEPLOY = at deploy time. POST = post-deploy verification.
Secrets et clés API (5 éléments)
La saisie semi-automatique de Cursor est formée sur du code open source où les secrets sont courants. Le modèle les suggère librement, surtout après une tentative d'authentification ratée.
- PRE — Write security rules into your project rules. Add a rule in
.cursor/rules(Cursor docs): "Never inlineSUPABASE_SERVICE_ROLE_KEY,sk_live_*, or any server secret into client-side code. Always use server-only imports." Cursor applies project rules as context for Agent and chat. - PRE — Audit Composer-generated files. Lorsque le Composer de Cursor crée un fichier entier (en particulier les gestionnaires d'authentification), examinez-le ligne par ligne. Composer intègre parfois des variables d'environnement qui doivent rester uniquement sur le serveur. Recherchez
NEXT_PUBLIC_ou des références directes aux clés de service dans les importations de composants. - PRE — Reject auto-imports of service clients into client components. Si Composer importe
import { supabase } from '@/lib/supabase/service'dans un fichier React, supprimez-le immédiatement et acheminez-le plutôt via un point de terminaison API. Les importations uniquement sur le serveur sont explicitement marquées : ne les ignorez pas. - PRE — Scan Agent-mode commits. Le mode Agent exécute les commandes du terminal et peut effectuer une validation directement. Auditez
git log --oneline -20etgit diff HEAD~5pour vous assurer qu'aucune chaîne d'apparence secrète n'a été validée lors de l'exécution d'un agent. - POST — Run Secrets in JavaScript Bundles. Analyse passive sur le URL déployé. Si une clé de service apparaît dans le bundle JS, faites-la pivoter immédiatement – la saisie semi-automatique de Cursor l'a probablement intégrée.
Contrôle d'accès à la base de données (4 éléments)
Composer génère souvent un code d'authentification fonctionnel mais ignore RLS — le moment « ça marche » aveugle les gens sur l'application manquante de la politique.
- PRE — Make Cursor generate migrations with RLS. In your project rules: "Every
CREATE TABLE public.*migration must includeALTER TABLE ... ENABLE ROW LEVEL SECURITYand a policy per command scoped toauth.uid()." Then ask Cursor to generate the migration. - PRE — Review Composer-generated policies. Composer écrit parfois des stratégies sans vérifier
auth.uid(). Les politiques commeallow select on public.itemssans clauseusingsont dangereusement larges. Exiger une correspondance user_id. - DEPLOY — Confirm RLS and policies are live. Open Supabase Studio and check that every table's RLS toggle is on and that each table has policies. A table with RLS on and no policies denies everything; one with
USING (true)allows everyone. - POST — Run a FixVibe scan on the deployed app. Check the Supabase Row-Level Security result: it shows any table an anonymous visitor can read with your public key.
Authentification et sessions (4 éléments)
Cursor génère rapidement des flux d'authentification mais manque souvent la subtile validation côté serveur qui assure la sécurité des jetons.
- PRE — Ensure all auth routes use
getUser(). RecherchezgetSession()dans vos itinéraires API et remplacez-le parawait supabase.auth.getUser().getSession()lit un cookie non vérifié ;getUser()valide avec le backend Supabase. - PRE — Check Composer auth handlers for token expiry. Les jetons Magic-link doivent être appliqués par le serveur
expires_at. La valeur par défaut de Supabase est de 1 heure — ne demandez pas à Cursor de la remplacer sans raison réelle. - PRE — Audit the sign-in redirect guard. La redirection du paramètre de requête
nextaprès la connexion doit être validée : doit commencer par/, jamais//. Le compositeur saute parfois cela. Ajoutez-le manuellement s'il est manquant. - POST — Test logout server-side state destruction. Connectez-vous, déconnectez-vous, inspectez les cookies (DevTools → Application → Cookies). Le cookie de session doit être effacé immédiatement. Si cela persiste, le gestionnaire de déconnexion ne détruit pas l'état.
HTTP en-têtes de sécurité et CSP (3 éléments)
Cursor génère rarement un middleware par défaut. Si vous ne le demandez pas explicitement, CSP et HSTS ne sont généralement pas là.
- PRE — Demand CSP in your project rules. Add: "Generate a
src/middleware.tswith Content-Security-Policy. Use nonce for script-src, no unsafe-inline." Then ask Cursor to generate it. Without this hint, middleware is skipped. - PRE — Verify
src/middleware.tsexists. Avec la disposition du répertoiresrc/, Next.js ne récupère quesrc/middleware.ts. Unmiddleware.tsau niveau racine est ignoré en silence. Si CSP n'atteint pas, vérifiez que le fichier est au bon endroit. - POST — Run HTTP Security Headers. L'analyse passive signale l'absence de CSP, HSTS, X-Frame-Options, X-Content-Type-Options. Ouvrez le rapport et suivez les instructions de correctif pour votre plateforme de déploiement.
Hygiène de déploiement (5 éléments)
Les applications Cursor atterrissent souvent sur Vercel, qui a de bonnes valeurs par défaut mais nécessite un renforcement explicite pour la limite build/deploy.
- DEPLOY — Check Vercel env-var scoping. Paramètres → Variables d'environnement → chaque secret doit être limité à Production uniquement. Ne partagez jamais
sk_live_*avec Preview ou Development. - DEPLOY — Disable build-log secret echo. Si votre workflow d'actions
vercel.jsonou GitHub comporteecho $SECRET, supprimez-le. Les journaux de build sont archivés publiquement ; les secrets des journaux sont compromis. - DEPLOY — Use Vercel's managed secrets, not inline workflow vars. Paramètres de Vercel → Les variables d'environnement sont chiffrées au repos. GitHub Les secrets des actions valent mieux que rien, mais sont conçus pour CI, et non pour l'intégration de la plateforme de déploiement.
- POST — Verify CSP nonce on the deployed preview. Ouvrez un lien d'aperçu Vercel dans le navigateur, ouvrez DevTools → Réseau → la réponse racine HTML. L'en-tête CSP doit être présent et inclure
'strict-dynamic'avec un nom occasionnel unique par requête. - POST — Rotate any key that ever shipped, even to Preview. Si une clé atteint le bundle de production pendant même 10 minutes, elle est compromise. Faites pivoter immédiatement.
Cursor pièges spécifiques (4 éléments)
Modèles propres au flux de travail de Cursor qui créent des risques de sécurité :
- Agent mode auto-fixes propagate old patterns. Si vous demandez à l'agent de "corriger les erreurs d'authentification", il peut régénérer le même fichier d'authentification plusieurs fois, en insérant à chaque fois la même clé de service si elle se trouve dans le contexte de base de code. Nettoyez d'abord l'original, puis demandez à l'agent de le réparer.
- L'indexation
@codebasede Cursor Index leaks intent. Cursor est puissante, mais si votre répertoire.cursorest exposé (S3 mal configuré, historique git), l'index révèle votre architecture et vos modèles secrets. Gardez.cursorlocal. - Composer mode loses context between files. Chaque fichier généré par Composer est récent. Si vous lui demandez de générer un fichier client, puis une route API, ils peuvent utiliser différentes configurations client Supabase. Examinez les deux et assurez-vous qu’ils correspondent à votre architecture.
- Autocomplete bias toward "working" over "secure". Cursor suggère le code le plus rapide qui passe votre contexte actuel. Si votre test contient
NEXT_PUBLIC_SERVICE_KEY, la saisie semi-automatique s'en souvient et le suggère à nouveau. Nettoyez les appareils de test avant de partager le code avec le modèle.
Prochaines étapes
Une fois que vous avez verrouillé les modèles spécifiques à Cursor, vérifiez par recoupement avec general vibe coding security checklist (51 éléments), puis avec step-by-step hardening. Consultez également le Claude Code checklist si vous mélangez des outils.
