Regel
Vermeiden Sie unbeabsichtigte globale Variable caching.In Node.js
und Python Server, globale Variablen bleiben bestehen über
Anfragen, verursacht Daten Datenlecks und Rennen Bedingungen.
Unterstützte Sprachen: JavaScript, TypeScript, PythonEinführung
Globale Variablen in Node.js-Servern bleiben für die gesamte Dauer des Prozesses bestehen, nicht nur für eine einzelne Anfrage. Wenn Request-Handler Benutzerdaten in globalen Variablen speichern, bleiben diese Daten für nachfolgende Anfragen von verschiedenen Benutzern zugänglich. Dies führt zu Sicherheitslücken, bei denen die Sitzungsdaten, Authentifizierungs-Tokens oder persönlichen Informationen von Benutzer A an Benutzer B weitergegeben werden.
Warum das wichtig ist
Auswirkungen auf die Sicherheit (Datenlecks): Globale Variablen, die benutzerspezifische Daten zwischenspeichern, verursachen anfrageübergreifende Datenlecks. Der Authentifizierungsstatus eines Benutzers, Sitzungsdaten oder persönliche Informationen werden für andere Benutzer sichtbar und verletzen so die Datenschutz- und Sicherheitsgrenzen.
Wettlaufbedingungen: Wenn mehrere gleichzeitige Anfragen dieselbe globale Variable ändern, besteht eine hohe Wahrscheinlichkeit für unvorhersehbares Verhalten. Die Daten von Benutzer A können während der Verarbeitung von der Anfrage von Benutzer B überschrieben werden, was zu falschen Berechnungen, einem beschädigten Status oder dazu führt, dass die Benutzer die Daten der anderen sehen.
Komplexität der Fehlersuche: Probleme, die durch das Zwischenspeichern globaler Variablen verursacht werden, sind bekanntermaßen schwer zu reproduzieren, da sie vom Timing der Anfragen und der Gleichzeitigkeit abhängen. Fehler treten in der Produktion unter Last sporadisch auf, werden aber bei Single-Thread-Entwicklungstests selten sichtbar.
Speicherlecks: Globale Variablen, in denen sich Daten ansammeln, ohne dass sie bereinigt werden, wachsen mit der Zeit ins Unermessliche. Jede Anfrage fügt mehr Daten zu den globalen Caches oder Arrays hinzu, was schließlich den Serverspeicher erschöpft und einen Neustart des Prozesses erfordert.
Code-Beispiele
❌ Nicht konform:
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
};
}
Warum das falsch ist: Die globalen Variablen currentUser und requestData bleiben über Anfragen hinweg bestehen. Wenn mehrere Anfragen gleichzeitig ausgeführt werden, kann die Anfrage von Benutzer B currentUser überschreiben, während buildUserProfile() von Benutzer A noch ausgeführt wird, wodurch Benutzer A die Daten von Benutzer B sieht.
✅ Konform:
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
};
}
Warum dies wichtig ist: Alle anfragespezifischen Daten werden in lokalen Variablen gespeichert, die auf den Request-Handler beschränkt sind. Jede Anfrage hat einen isolierten Zustand, der nicht an andere gleichzeitige Anfragen weitergegeben werden kann. Funktionen erhalten Daten über Parameter, anstatt auf den globalen Zustand zuzugreifen, wodurch Race Conditions vermieden werden.
Schlussfolgerung
Bewahren Sie alle anfragespezifischen Daten in lokalen Variablen oder in von Ihrem Framework bereitgestellten Anfrageobjekten auf. Verwenden Sie globale Variablen nur für wirklich gemeinsam genutzte Zustände wie Konfiguration, Verbindungspools oder schreibgeschützte Caches. Wenn ein globaler Zustand notwendig ist, verwenden Sie geeignete Gleichzeitigkeitskontrollen und stellen Sie sicher, dass die Daten niemals benutzerspezifisch sind.
.avif)
