Sicherheit von JavaScript-Anwendungen: Top-10-Schwachstellen für Anfänger
\n\nDie Entwicklung mit JavaScript, insbesondere in der Node.js-Umgebung, eröffnet vielfältige Möglichkeiten zur Erstellung moderner Webanwendungen. Mit der Leistungsfähigkeit geht jedoch auch Verantwortung einher. Die Missachtung von Sicherheitsaspekten kann zu Datenlecks, finanziellen Verlusten und Reputationsschäden führen. Für Entwicklungsanfänger ist das Verständnis der grundlegenden Bedrohungen der erste Schritt zur Erstellung sicheren Codes. In diesem Artikel analysieren wir die Top-10-Schwachstellen von JavaScript (Node.js) basierend auf der OWASP-Liste, mit Codebeispielen und praktischen Schutzmaßnahmen.
\n\n1. Cross-Site-Scripting (XSS)
\nXSS ist einer der häufigsten Angriffe. Ein Angreifer schleust ein schädliches Skript in eine Webseite ein, das im Browser des Opfers ausgeführt wird. In Node.js geschieht dies oft durch nicht maskierte Datenausgabe.
\n\nBeispiel für anfälligen Code (Express):
\napp.get('/user/:name', (req, res) => {\n res.send('<h1>Hallo, ' + req.params.name + '</h1>');\n});\n\n\nSo schützen Sie sich: Verwenden Sie Template-Engines mit automatischer Maskierung (z. B. Handlebars, EJS) oder Bibliotheken wie helmet. Fügen Sie Benutzereingaben niemals direkt in HTML ein.
app.get('/user/:name', (req, res) => {\n const safeName = encodeURIComponent(req.params.name);\n res.send(`<h1>Hallo, ${safeName}</h1>`);\n});\n\n\n2. SQL-Injection
\nWenn Ihre Anwendung eine SQL-Datenbank (z. B. PostgreSQL oder MySQL) verwendet, kann eine unsachgemäße Abfrageverarbeitung zur Ausführung beliebigen SQL-Codes führen.
\n\nAnfälliger Code:
\nconst query = `SELECT * FROM users WHERE email = '${userInput}'`;\ndb.query(query, callback);\n\n\nLösung: Verwenden Sie immer parametrisierte Abfragen oder ORMs (z. B. Sequelize, Prisma).
\n\nconst query = 'SELECT * FROM users WHERE email = $1';\ndb.query(query, [userInput], callback);\n\n\n3. Cross-Site Request Forgery (CSRF)
\nEin CSRF-Angriff zwingt einen Benutzer dazu, eine unerwünschte Aktion auf einer Website auszuführen, bei der er authentifiziert ist. Zum Beispiel eine Überweisung oder eine Passwortänderung.
\n\nSchutz: Verwenden Sie CSRF-Token. In Express ist die Bibliothek csurf beliebt (veraltet, aber ersetzt durch csrf-csrf oder integrierte Framework-Lösungen).
const csrf = require('csrf-csrf');\nconst { generateToken } = csrf();\n\napp.post('/transfer', (req, res) => {\n const token = req.body._csrf;\n if (!validateToken(token)) {\n return res.status(403).send('CSRF-Angriff');\n }\n // Überweisung ausführen\n});\n\n\n4. Ungeschützte Abhängigkeiten
\nNode.js-Anwendungen verwenden Tausende von Paketen aus npm. Veraltete oder anfällige Abhängigkeiten sind eine häufige Ursache für Hackerangriffe.
\n\nEmpfehlungen:
\n- \n
- Führen Sie regelmäßig
npm auditzur Überprüfung auf Schwachstellen aus. \n - Verwenden Sie
snykoderDependabotfür automatische Updates. \n - Entfernen Sie ungenutzte Pakete. \n
5. Unsichere Authentifizierung und Sitzungsverwaltung
\nSchwache Passwörter, fehlende Begrenzung der Anmeldeversuche, unsachgemäße Speicherung von Sitzungstoken – all dies führt zur Kompromittierung von Konten.
\n\nBest Practices:
\n- \n
- Speichern Sie Passwörter gehasht (bcrypt, argon2). \n
- Verwenden Sie JWT mit kurzer Lebensdauer und Refresh-Token. \n
- Legen Sie ein Limit für Anmeldeversuche fest (Rate Limiting). \n
const bcrypt = require('bcrypt');\nconst saltRounds = 10;\n\n// Registrierung\nconst hash = await bcrypt.hash(password, saltRounds);\n\n// Anmeldung\nconst match = await bcrypt.compare(inputPassword, hash);\n\n\n6. Mängel der Zugriffskontrolle
\nBen