JavaScript-Sicherheit: Schutz vor SQL-Injection und XSS — Der vollständige Leitfaden für Entwickler
\n\nHaben Sie sich jemals gefragt, warum Hacker Webanwendungen so sehr lieben? Die Antwort ist einfach: Entwickler lassen oft die „Türen“ offen. Die beiden beliebtesten Schlupflöcher sind SQL-Injection und XSS (Cross-Site-Scripting). Auch wenn Sie in JavaScript schreiben, bedeutet das nicht, dass Sie vor Angriffen auf das Backend geschützt sind. In diesem Artikel analysieren wir, wie Sie Schwachstellen erkennen und, vor allem, wie Sie sie mit modernen Sicherheitspraktiken schließen.
\n\nWarum sollte ein JavaScript-Entwickler über Sicherheit nachdenken?
\nViele Anfänger denken: „Ich schreibe Frontend-Code, habe nichts mit Datenbanken zu tun – mir droht keine Gefahr.“ Das ist ein gefährlicher Irrglaube. JavaScript läuft heute überall: auf dem Client (Browser), auf dem Server (Node.js) und sogar in Datenbanken (MongoDB). Das bedeutet, die Verantwortung für die Sicherheit liegt bei Ihnen. SQL-Injection und XSS sind nicht nur langweilige Begriffe aus Lehrbüchern, sondern reale Bedrohungen, die Ihr Projekt zerstören können, indem sie Benutzerdaten stehlen oder Ihre Website zu einer Virenschleuder machen.
\n\nSQL-Injection: Die unsichtbare Bedrohung für Ihre Datenbank
\nSQL-Injection ist ein Angriff, bei dem ein Angreifer bösartigen SQL-Code über Eingabefelder (Formulare, URLs, Header) „einschleust“. Wenn Sie Node.js mit PostgreSQL, MySQL oder einer anderen relationalen Datenbank verwenden, sind Sie gefährdet.
\n\nWie sieht eine SQL-Injection in JavaScript aus?
\nStellen Sie sich vor, Sie haben ein Login-Formular und schreiben die Abfrage so:
\n// ❌ GEFÄHRLICH: anfällig für SQL-Injection\nconst username = req.body.username;\nconst password = req.body.password;\nconst query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;\nStellen Sie sich nun vor, der Angreifer gibt im Feld username Folgendes ein: admin' --. Die Abfrage wird zu:
SELECT * FROM users WHERE username = 'admin' --' AND password = '';\n-- ist ein Kommentar in SQL. Alles danach wird ignoriert. Der Hacker hat sich ohne Passwort als Admin angemeldet. Und wenn er '; DROP TABLE users; -- eingibt? Sie verlieren die gesamte Benutzertabelle.
Schutz: Parametrisierte Abfragen (Prepared Statements)
\nDer beste Schutz vor SQL-Injection ist, Benutzerdaten niemals direkt in die Abfragezeichenfolge einzufügen. Verwenden Sie parametrisierte Abfragen. So geht es in Node.js mit der Bibliothek pg (PostgreSQL):
// ✅ SICHER: parametrisierte Abfrage\nconst { Pool } = require('pg');\nconst pool = new Pool();\n\napp.post('/login', async (req, res) => {\n const { username, password } = req.body;\n \n // $1 und $2 sind Platzhalter\n const query = 'SELECT * FROM users WHERE username = $1 AND password = $2';\n const values = [username, password];\n \n try {\n const result = await pool.query(query, values);\n // Ergebnis verarbeiten...\n } catch (error) {\n console.error('Abfragefehler:', error);\n }\n});\nDie Bibliothek maskiert die Werte automatisch. Selbst wenn der Angreifer admin' -- übergibt, wird dies als normale Zeichenfolge und nicht als SQL-Befehl interpretiert.
Zusätzliche Schutzmaßnahmen
\n- \n
- Serverseitige Validierung: Überprüfen Sie Typ und Länge der Eingabedaten. Wenn eine E-Mail erwartet wird, stellen Sie sicher, dass es sich tatsächlich um eine E-Mail handelt. \n
- Prinzip der geringsten Privilegien: Verwenden Sie in der Anwendung keinen Root-Benutzer der Datenbank. Erstellen Sie einen separaten Benutzer mit Rechten nur für die benötigten Tabellen. \n
- ORM-Bibliotheken: Verwenden Sie Prisma, Sequelize oder TypeORM. Sie automatisieren die Parametrisierung, aber vergessen Sie nicht, dass auch mit ihnen unsicherer Code geschrieben werden kann (z. B. durch Verwendung von
sequelize.querymit Zeichenkettenverkettung). \n
XSS (Cross-Site-Scripting): Wenn Ihre Website sich selbst angreift
\nXSS ist ein Angriff, bei dem ein Angreifer bösartigen JavaScript-Code auf eine Seite einschleust, der