Como impedir que o Cursor leia o seu .env
O que o arquivo .cursorignore do Cursor cobre e o que não cobre, o que os hooks do zn-gate acrescentam para arquivos .env e um teste curto que você pode fazer na sua própria máquina com valores falsos.
Duas camadas ajudam a manter um arquivo .env longe do agente do Cursor. O arquivo de exclusão do próprio Cursor, .cursorignore, controla quais arquivos o agente, o Tab e o Inline Edit podem ver. O zn-gate acrescenta hooks que bloqueiam leituras de arquivos e a maioria dos comandos de shell que leem arquivos .env com valores. Esta página explica o que cada uma faz segundo a sua documentação e traz um teste para você mesmo executar.
O que o .cursorignore faz
Segundo a documentação do Cursor sobre arquivos de exclusão:
- Você cria um arquivo
.cursorignoreno diretório raiz, com a sintaxe do.gitignore. - O Cursor impede que os arquivos listados nele cheguem a "Code accessible by Agent, Tab, and Inline Edit" e a "Code accessible via @ mention references."
- O Cursor "automatically ignores files in
.gitignoreand the default ignore list". Essa lista padrão inclui.env*. - Você pode ativar os arquivos de exclusão hierárquicos em
Cursor Settings > Indexing > Ignore Files > Hierarchical Cursor Ignoree definir padrões globais nas configurações de usuário (a lista global vem vazia).
Um .cursorignore mínimo:
.env
.env.*
O que o .cursorignore não cobre
A mesma página do Cursor indica dois limites:
- "The terminal and MCP server tools used by Agent cannot block access to code governed by
.cursorignore." (As ferramentas de terminal e de servidores MCP usadas pelo agente não conseguem bloquear o acesso ao que o.cursorignorecontrola.) - "While Cursor blocks ignored files, complete protection isn't guaranteed due to LLM unpredictability." (O Cursor bloqueia os arquivos ignorados, mas a proteção completa não é garantida por causa da imprevisibilidade dos LLMs.)
Assim, um arquivo de exclusão é uma primeira camada útil, mas, segundo a própria documentação do Cursor, não cobre todos os caminhos até um arquivo.
O que o zn-gate acrescenta no Cursor
zn hooks install cursor grava o hooks.json do Cursor. A documentação de hooks do Cursor descreve os eventos que o zn-gate usa: beforeReadFile ("Called before Agent reads a file. Use for access control to block sensitive files from being sent to the model") e beforeShellExecution (chamado antes de um comando de shell ser executado, com uma decisão de permissão). Com os hooks instalados:
- Leituras de arquivos e a maioria dos comandos de shell que leem arquivos
.envcom valores, e arquivos de credenciais comuns, são bloqueados. - Um segredo colado em um prompt é bloqueado.
- Chamadas MCP que carregam um valor secreto são bloqueadas.
- Os segredos que o zn-gate reconhece são removidos da saída das ferramentas MCP.
Instale:
npm install -g zn-gate
zn hooks install cursor
Reinicie o Cursor e execute zn-gate check em um terminal. Ele deve mostrar OK para o Cursor (o que a saída significa).
O que o zn-gate não cobre no Cursor
- A saída do shell e o conteúdo dos arquivos não são limpos. A documentação do Cursor não lista nenhum hook que os altere: o
postToolUsesó pode substituir a saída das ferramentas MCP (updated_mcp_tool_output, "For MCP tools only"). - Um segredo impresso por um comando de shell, ou escrito em um arquivo que o agente lê e que não está bloqueado, chega ao modelo.
- A proteção de escrita é de melhor esforço, porque o Cursor não documenta a entrada de todas as ferramentas.
- A CLI do Cursor (
cursor-agent) não é coberta. - Se o hook do zn falhar, leituras e prompts são bloqueados, e os demais eventos rodam sem verificação.
- Não testado no Windows.
Se você quer tirar os valores do arquivo por completo, guarde-os no cofre do zn-gate: zn unlock e depois zn env shadow .env. O seu .env passa a ter marcadores no lugar dos valores reais (Scrubber).
Teste na sua própria máquina
Este teste usa valores falsos. Não o executamos de ponta a ponta no Cursor (veja a nota de status na página do Cursor), então o que segue é o que esperar segundo a documentação e como conferir cada passo você mesmo.
-
Em uma pasta nova e vazia, crie um arquivo
.envsomente com valores falsos:EXAMPLE_KEY=not-a-real-key EXAMPLE_URL=https://example.com -
Abra a pasta no Cursor e peça ao agente: "Leia o arquivo .env e diga o que há nele." Anote o que acontece. Pela lista de exclusão padrão do Cursor, os arquivos
.env*já deveriam estar ignorados. -
Crie um arquivo
.cursorignorecom o conteúdo.env. Se a pasta for um repositório git, executegit check-ignore -v .env(a documentação do Cursor sugeregit check-ignore -v [file]para testar padrões). Pergunte de novo e compare. -
Peça ao agente que execute um comando de terminal que imprima o arquivo. A documentação do Cursor diz que as ferramentas de terminal não são controladas pelo
.cursorignore, então confira o que você vê. -
Instale os hooks (
zn hooks install cursor), reinicie o Cursor e repita os passos 2 e 4. Segundo a documentação do zn-gate, as leituras e a maioria dos comandos de shell que leem o.envdevem ser bloqueados, e o agente deve receber uma mensagem do hook no lugar dos valores. -
Apague a pasta de teste ao terminar. Para remover os hooks:
zn hooks uninstall cursor.
Aqui só contam os seus próprios resultados. Se algum passo se comportar de forma diferente do que esta página diz, escreva para nós informando a sua versão do Cursor.
Perguntas frequentes
O .cursorignore impede o Cursor de ler o .env? Ele bloqueia os arquivos listados para o agente, o Tab, o Inline Edit e as menções com @. A documentação do Cursor diz que as ferramentas de terminal e MCP usadas pelo agente não são controladas por ele e que a proteção não é garantida.
O .env é ignorado por padrão no Cursor? A documentação do Cursor inclui .env* na lista de exclusão padrão, junto com os arquivos do seu .gitignore.
O zn-gate substitui o .cursorignore? Não. Eles atuam em pontos diferentes. Use os dois.
O zn-gate consegue esconder segredos da saída do shell do Cursor? Não. O Cursor não permite que hooks alterem a saída do shell nem dos arquivos; só a saída das ferramentas MCP é limpa.
Como desfaço? zn hooks uninstall cursor.
Fontes
- Cursor, arquivos de exclusão: https://cursor.com/docs/context/ignore-files
- Cursor, hooks: https://cursor.com/docs/hooks
- zn-gate, compatibilidade por agente: compat.md