Comment empêcher Cursor de lire votre .env

Ce que couvre le fichier .cursorignore de Cursor et ce qu'il ne couvre pas, ce qu'ajoutent les hooks de zn-gate pour les fichiers .env, et un court test à faire sur votre machine avec de fausses valeurs.

Voir le .md

Deux couches aident à garder un fichier .env hors de portée de l'agent de Cursor. Le fichier d'exclusion propre à Cursor, .cursorignore, contrôle quels fichiers l'agent, Tab et Inline Edit peuvent voir. zn-gate ajoute des hooks qui bloquent les lectures de fichiers et la plupart des commandes shell qui lisent des fichiers .env contenant des valeurs. Cette page explique ce que fait chacune d'elles d'après sa documentation, et propose un test à faire vous-même.

Ce que fait .cursorignore

D'après la documentation de Cursor sur les fichiers d'exclusion :

  • Vous créez un fichier .cursorignore à la racine, avec la syntaxe de .gitignore.
  • Cursor empêche les fichiers qui y figurent d'apparaître dans "Code accessible by Agent, Tab, and Inline Edit" et dans "Code accessible via @ mention references."
  • Cursor "automatically ignores files in .gitignore and the default ignore list". Cette liste par défaut inclut .env*.
  • Vous pouvez activer les fichiers d'exclusion hiérarchiques dans Cursor Settings > Indexing > Ignore Files > Hierarchical Cursor Ignore et définir des motifs globaux dans les réglages utilisateur (la liste globale est vide par défaut).

Un .cursorignore minimal :

.env
.env.*

Ce que .cursorignore ne couvre pas

La même page de Cursor indique deux limites :

  • "The terminal and MCP server tools used by Agent cannot block access to code governed by .cursorignore." (Les outils de terminal et de serveurs MCP utilisés par l'agent ne peuvent pas bloquer l'accès à ce que régit .cursorignore.)
  • "While Cursor blocks ignored files, complete protection isn't guaranteed due to LLM unpredictability." (Cursor bloque les fichiers ignorés, mais une protection complète n'est pas garantie en raison de l'imprévisibilité des LLM.)

Un fichier d'exclusion est donc une première couche utile, mais, d'après la documentation de Cursor elle-même, elle ne couvre pas tous les chemins vers un fichier.

Ce qu'ajoute zn-gate dans Cursor

zn hooks install cursor écrit le hooks.json de Cursor. La documentation des hooks de Cursor décrit les événements utilisés par zn-gate : beforeReadFile ("Called before Agent reads a file. Use for access control to block sensitive files from being sent to the model") et beforeShellExecution (appelé avant l'exécution d'une commande shell, avec une décision de permission). Avec les hooks installés :

  • Les lectures de fichiers et la plupart des commandes shell qui lisent des fichiers .env contenant des valeurs, ainsi que les fichiers d'identifiants courants, sont bloquées.
  • Un secret collé dans un prompt est bloqué.
  • Les appels MCP qui transportent une valeur secrète sont bloqués.
  • Les secrets que zn-gate reconnaît sont retirés de la sortie des outils MCP.

Installez-le :

npm install -g zn-gate
zn hooks install cursor

Redémarrez Cursor, puis lancez zn-gate check dans un terminal. Il doit afficher OK pour Cursor (ce que signifie la sortie).

Ce que zn-gate ne couvre pas dans Cursor

  • La sortie du shell et le contenu des fichiers ne sont pas nettoyés. La documentation de Cursor ne liste aucun hook qui les modifie : postToolUse ne peut remplacer que la sortie des outils MCP (updated_mcp_tool_output, "For MCP tools only").
  • Un secret affiché par une commande shell, ou écrit dans un fichier que l'agent lit et qui n'est pas bloqué, parvient au modèle.
  • La protection en écriture se fait au mieux, car Cursor ne documente pas l'entrée de tous ses outils.
  • Le CLI de Cursor (cursor-agent) n'est pas couvert.
  • Si le hook de zn plante, les lectures et les prompts sont bloqués, et les autres événements s'exécutent sans contrôle.
  • Non testé sous Windows.

Pour sortir complètement les valeurs du fichier, gardez-les dans le coffre de zn-gate : zn unlock, puis zn env shadow .env. Votre .env contient alors des marqueurs à la place des vraies valeurs (Scrubber).

Testez sur votre propre machine

Ce test utilise de fausses valeurs. Nous ne l'avons pas exécuté de bout en bout dans Cursor (voir la note d'état sur la page Cursor) : ce qui suit décrit donc ce à quoi s'attendre d'après la documentation, et comment vérifier chaque étape vous-même.

  1. Dans un dossier neuf et vide, créez un fichier .env avec uniquement de fausses valeurs :

    EXAMPLE_KEY=not-a-real-key
    EXAMPLE_URL=https://example.com
  2. Ouvrez le dossier dans Cursor et demandez à l'agent : "Lis le fichier .env et dis-moi ce qu'il contient." Notez ce qui se passe. D'après la liste d'exclusion par défaut de Cursor, les fichiers .env* devraient déjà être ignorés.

  3. Créez un fichier .cursorignore contenant .env. Si le dossier est un dépôt git, lancez git check-ignore -v .env (la documentation de Cursor suggère git check-ignore -v [file] pour tester les motifs). Posez à nouveau la question et comparez.

  4. Demandez à l'agent d'exécuter une commande de terminal qui affiche le fichier. La documentation de Cursor indique que les outils de terminal ne sont pas régis par .cursorignore : observez ce que vous obtenez.

  5. Installez les hooks (zn hooks install cursor), redémarrez Cursor et refaites les étapes 2 et 4. D'après la documentation de zn-gate, les lectures et la plupart des commandes shell qui lisent le .env devraient être bloquées, et l'agent devrait recevoir un message du hook à la place des valeurs.

  6. Supprimez le dossier d'essai une fois terminé. Pour retirer les hooks : zn hooks uninstall cursor.

Seuls vos propres résultats comptent ici. Si une étape se comporte autrement que ce que dit cette page, écrivez-nous en indiquant votre version de Cursor.

Questions fréquentes

.cursorignore empêche-t-il Cursor de lire .env ? Il bloque les fichiers listés pour l'agent, Tab, Inline Edit et les mentions avec @. La documentation de Cursor indique que les outils de terminal et MCP utilisés par l'agent ne sont pas régis par ce fichier, et que la protection n'est pas garantie.

.env est-il ignoré par défaut dans Cursor ? La documentation de Cursor place .env* dans sa liste d'exclusion par défaut, avec les fichiers de votre .gitignore.

zn-gate remplace-t-il .cursorignore ? Non. Ils agissent à des endroits différents. Utilisez les deux.

zn-gate peut-il masquer les secrets dans la sortie shell de Cursor ? Non. Cursor ne permet pas aux hooks de modifier la sortie du shell ni des fichiers ; seule la sortie des outils MCP est nettoyée.

Comment annuler ? zn hooks uninstall cursor.

Sources