Regra
Evitar não intencional global variáveis caching.In Node.js
e Python servidores, globais variáveis persistem através de
pedidos, causando dados fugas e condições de corrida condições de corrida.
Linguagens suportadas: JavaScript, TypeScript, PythonIntrodução
Variáveis globais em servidores Node.js persistem durante todo o ciclo de vida do processo, não apenas para uma única requisição. Quando os manipuladores de requisição armazenam dados de usuário em variáveis globais, esses dados permanecem acessíveis a requisições subsequentes de diferentes usuários. Isso cria vulnerabilidades de segurança onde dados de sessão, tokens de autenticação ou informações pessoais do usuário A vazam para o usuário B.
Por que isso importa
Implicações de segurança (vazamentos de dados): Variáveis globais que armazenam em cache dados específicos do usuário criam vazamentos de dados entre requisições. O estado de autenticação, dados de sessão ou informações pessoais de um usuário tornam-se visíveis para outros usuários, violando os limites de privacidade e segurança.
Condições de corrida: Quando múltiplas requisições concorrentes modificam a mesma variável global, há uma grande chance de comportamento imprevisível. Os dados do Usuário A podem ser sobrescritos pela requisição do Usuário B no meio do processamento, levando a cálculos incorretos, estado corrompido ou usuários vendo os dados uns dos outros.
Complexidade de depuração: Problemas causados por caching de variáveis globais são notoriamente difíceis de reproduzir porque dependem do tempo da requisição e da concorrência. Bugs aparecem intermitentemente em produção sob carga, mas raramente se manifestam em testes de desenvolvimento single-threaded.
Vazamentos de memória: Variáveis globais que acumulam dados sem limpeza crescem ilimitadamente ao longo do tempo. Cada requisição adiciona mais dados a caches ou arrays globais, eventualmente esgotando a memória do servidor e exigindo reinícios de processo.
Exemplos de código
❌ Não-conforme:
let currentUser = null;
let requestData = {};
app.get('/profile', async (req, res) => {
currentUser = await getUserById(req.userId);
requestData = req.body;
const profile = await buildUserProfile(currentUser);
res.json(profile);
});
function buildUserProfile(user) {
return {
name: currentUser.name,
data: requestData
};
}
Por que está errado: As variáveis globais currentUser e requestData persistem entre as requisições. Quando múltiplas requisições são executadas concorrentemente, a requisição do usuário B pode sobrescrever currentUser enquanto buildUserProfile() do usuário A ainda está sendo executado, fazendo com que o usuário A veja os dados do usuário B.
✅ Compatível:
app.get('/profile', async (req, res) => {
const currentUser = await getUserById(req.userId);
const requestData = req.body;
const profile = buildUserProfile(currentUser, requestData);
res.json(profile);
});
function buildUserProfile(user, data) {
return {
name: user.name,
data: data
};
}
Por que isso importa: Todos os dados específicos da requisição são armazenados em variáveis locais com escopo no handler da requisição. Cada requisição possui um estado isolado que não pode vazar para outras requisições concorrentes. As funções recebem dados por meio de parâmetros em vez de acessar o estado global, eliminando condições de corrida.
Conclusão
Mantenha todos os dados específicos da requisição em variáveis locais ou objetos de requisição fornecidos pelo seu framework. Use variáveis globais apenas para estados verdadeiramente compartilhados, como configuração, pools de conexão ou caches somente leitura. Quando o estado global for necessário, utilize controles de concorrência adequados e garanta que os dados nunca sejam específicos do usuário.
.avif)
