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, PythonEinleitung
Globale Variablen in Node.js-Servern bleiben über die gesamte Lebensdauer 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 Sitzungsdaten, Authentifizierungs-Tokens oder persönliche Informationen von Benutzer A an Benutzer B gelangen können.
Warum es wichtig ist
Sicherheitsimplikationen (Datenlecks): Globale Variablen, die benutzerspezifische Daten cachen, erzeugen Cross-Request-Datenlecks. Der Authentifizierungsstatus, die Sitzungsdaten oder persönliche Informationen eines Benutzers werden für andere Benutzer sichtbar, was Datenschutz- und Sicherheitsgrenzen verletzt.
Race Conditions: Wenn mehrere gleichzeitige Anfragen dieselbe globale Variable modifizieren, besteht eine hohe Wahrscheinlichkeit für unvorhersehbares Verhalten. Die Daten von Benutzer A können während der Verarbeitung durch die Anfrage von Benutzer B überschrieben werden, was zu falschen Berechnungen, einem korrupten Zustand oder dazu führen kann, dass Benutzer die Daten des jeweils anderen sehen.
Debugging-Komplexität: Probleme, die durch globales Variablen-Caching verursacht werden, sind notorisch schwer zu reproduzieren, da sie von Request-Timing und Parallelität abhängen. Fehler treten in der Produktion unter Last sporadisch auf, zeigen sich aber selten bei Single-Threaded-Entwicklungstests.
Speicherlecks: Globale Variablen, die Daten ohne Bereinigung ansammeln, wachsen im Laufe der Zeit unbegrenzt an. Jede Anfrage fügt globalen Caches oder Arrays weitere Daten hinzu, was schließlich den Serverspeicher erschöpft und Prozessneustarts 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 es 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 das wichtig ist: Alle anforderungsspezifischen Daten werden in lokalen Variablen gespeichert, die auf den Request-Handler beschränkt sind. Jede Anfrage hat einen isolierten Zustand, der nicht auf andere gleichzeitige Anfragen übergreifen kann. Funktionen empfangen Daten über Parameter, anstatt auf den globalen Zustand zuzugreifen, wodurch Race Conditions eliminiert werden.
Fazit
Halten Sie alle anfragespezifischen Daten in lokalen Variablen oder Request-Objekten, die von Ihrem Framework bereitgestellt werden. Verwenden Sie globale Variablen nur für wirklich gemeinsam genutzte Zustände wie Konfigurationen, Verbindungspools oder Read-only-Caches. Wenn ein globaler Zustand erforderlich ist, verwenden Sie geeignete Parallelitätskontrollen und stellen Sie sicher, dass die Daten niemals benutzerspezifisch sind.
.avif)
