Regel
Vermeiden Sie SELECT * in SQL Abfragen.
SELECT * in Produktion Code macht Anwendungen
anfällig auf Schema Änderungen und verdunkelt Daten Abhängigkeiten.
Unterstützte Sprachen: 45+Einführung
Verwendung von SELECT * in Produktionsabfragen ruft jede Spalte aus einer Tabelle ab, einschließlich der Spalten, die Ihre Anwendung nicht verwendet. Wenn sich Datenbankschemata weiterentwickeln und neue Spalten hinzugefügt werden (einschließlich sensibler Daten wie Passwörter oder PII), können Abfragen mit SELECT * automatisch und ohne Codeänderung abrufen. Dies schafft Sicherheitslücken und bricht Annahmen in Ihrer Anwendungslogik.
Warum das wichtig ist
Auswirkungen auf die Leistung: Der Abruf unnötiger Spalten erhöht die Ausführungszeit der Abfrage, die Größe der Netzwerkübertragung und den Speicherverbrauch. Eine Tabelle mit 50 Spalten, von denen Sie nur 5 benötigen, bedeutet, dass Sie 10x mehr Daten als nötig übertragen, was die Antwortzeiten verschlechtert und die Infrastrukturkosten erhöht.
Auswirkungen auf die Sicherheit: Neue Spalten, die zu Tabellen hinzugefügt werden (Audit-Felder, interne Flags, sensible Benutzerdaten), werden automatisch durch SELECT * Abfragen. Ihre API könnte anfangen, Passwort-Hashes, SSNs oder interne Geschäftsdaten durchzulassen, die nie für diesen Endpunkt vorgesehen waren.
Wartbarkeit des Codes: Wenn SELECT * Abfragen nach Schemaänderungen abbrechen, tritt der Fehler zur Laufzeit auf, nicht zur Kompilierzeit. Eine neue nicht-nullbare Spalte oder ein umbenanntes Feld führt zu Produktionsfehlern. Explizite Spaltenlisten machen Abhängigkeiten deutlich und brechen Builds ab, wenn sich Schemata inkompatibel ändern.
Code-Beispiele
❌ Nicht konform:
async function getUserProfile(userId) {
const query = 'SELECT * FROM users WHERE id = ?';
const [user] = await db.execute(query, [userId]);
return {
name: user.name,
email: user.email,
createdAt: user.created_at
};
}
Warum das falsch ist: Damit werden alle Spalten abgerufen, einschließlich potenziell sensibler Felder wie password_hash, ssn, internal_notes oder deleted_at. Wenn das Schema wächst, wird diese Abfrage langsamer und gibt mehr Daten preis, obwohl die Anwendung nur drei Felder verwendet.
✅ Konform:
async function getUserProfile(userId) {
const query = `
SELECT name, email, created_at
FROM users
WHERE id = ?
`;
const [user] = await db.execute(query, [userId]);
return {
name: user.name,
email: user.email,
createdAt: user.created_at
};
}
Schlussfolgerung
Geben Sie in SQL-Abfragen immer explizite Spaltenlisten an. Dies verhindert Datenlecks, verbessert die Leistung und macht die Abhängigkeiten zwischen Code und Schema deutlich. Die geringen Vorlaufkosten für die Eingabe von Spaltennamen verhindern ganze Klassen von Sicherheits- und Leistungsproblemen.
.avif)
