Sicherheit von JavaScript-Anwendungen: Top-10-Schwachstellen für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Sicherheit von JavaScript-Anwendungen: Top-10-Schwachstellen für Anfänger

\n\n

Die 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\n

1. Cross-Site-Scripting (XSS)

\n

XSS 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\n

Beispiel für anfälligen Code (Express):

\n
app.get('/user/:name', (req, res) => {\n  res.send('<h1>Hallo, ' + req.params.name + '</h1>');\n});\n
\n\n

So 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.

\n\n
app.get('/user/:name', (req, res) => {\n  const safeName = encodeURIComponent(req.params.name);\n  res.send(`<h1>Hallo, ${safeName}</h1>`);\n});\n
\n\n

2. SQL-Injection

\n

Wenn 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\n

Anfälliger Code:

\n
const query = `SELECT * FROM users WHERE email = '${userInput}'`;\ndb.query(query, callback);\n
\n\n

Lösung: Verwenden Sie immer parametrisierte Abfragen oder ORMs (z. B. Sequelize, Prisma).

\n\n
const query = 'SELECT * FROM users WHERE email = $1';\ndb.query(query, [userInput], callback);\n
\n\n

3. Cross-Site Request Forgery (CSRF)

\n

Ein 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\n

Schutz: Verwenden Sie CSRF-Token. In Express ist die Bibliothek csurf beliebt (veraltet, aber ersetzt durch csrf-csrf oder integrierte Framework-Lösungen).

\n\n
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\n

4. Ungeschützte Abhängigkeiten

\n

Node.js-Anwendungen verwenden Tausende von Paketen aus npm. Veraltete oder anfällige Abhängigkeiten sind eine häufige Ursache für Hackerangriffe.

\n\n

Empfehlungen:

\n
    \n
  • Führen Sie regelmäßig npm audit zur Überprüfung auf Schwachstellen aus.
  • \n
  • Verwenden Sie snyk oder Dependabot für automatische Updates.
  • \n
  • Entfernen Sie ungenutzte Pakete.
  • \n
\n\n

5. Unsichere Authentifizierung und Sitzungsverwaltung

\n

Schwache Passwörter, fehlende Begrenzung der Anmeldeversuche, unsachgemäße Speicherung von Sitzungstoken – all dies führt zur Kompromittierung von Konten.

\n\n

Best 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
\n\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\n

6. Mängel der Zugriffskontrolle

\n

Ben

Blogs

Buchempfehlungen