flawopen.com/SQL-Injection/Javascript
Stell dir ein Formular vor, das nur eine Ticketnummer erwartet. SQL-Injection passiert, wenn jemand Code in dieses Feld eingibt, der die Datenbank dazu bringt, alle Daten herauszugeben, weil die Eingabe unbereinigt in den Befehl eingefügt wurde.
SQL-Injection tritt auf, wenn benutzergesteuerte Eingaben direkt in eine SQL-Abfrage eingefügt werden. In Node.js ist die Falle besonders tückisch, da Template-Literale syntaktisch elegant aussehen, jedoch identisch mit unsicherer Zeichenkettenverkettung sind.
2015 erlitt der britische Telekommunikationsanbieter TalkTalk einen Datenschutzvorfall mit über 150.000 betroffenen Kunden durch eine SQL-Injection-Schwachstelle. Die Aufsichtsbehörde verhängte eine Strafe von 400.000 £.
Quelle: UK Information Commissioner's Office, 2016.// userId comes straight from request query
async function getUser(pool, userId) {
const query = `SELECT * FROM users
WHERE id = ${userId}`;
const [rows] = await pool.query(query);
return rows[0];
}
// value is passed separately, never inlined
async function getUser(pool, userId) {
const [rows] = await pool.query(
'SELECT * FROM users WHERE id = ?',
[userId]
);
return rows[0];
}
Die behobene Version übergibt die Abfrage und die Parameter als zwei separate Argumente an den Treiber. Die Datenbank kompiliert zuerst die Abfragestruktur, bevor die Werte gebunden werden.
mysql2 verwendet Fragezeichen (?), während pg (PostgreSQL) nummerierte Platzhalter ($1, $2) nutzt. Das Vermischen führt zu Laufzeitfehlern.
Prisma schützt standardmäßig, aber $queryRawUnsafe hebt diesen Schutz vollständig auf.
Asynchronität betrifft nur das I/O-Modell, bietet aber keinerlei Schutz gegen fehlerhafte SQL-Syntaxkonstruktion.
grep -rn "query(\`.*\${" --include="*.js" --include="*.ts" .
npx eslint --rule 'no-template-curly-in-string: error' .
p/javascript ruleset in CI to catch unparameterized database queries automatically.Ja für den QueryBuilder, aber nicht bei rohen Abfragen mit query() oder where() ohne Parameterbindung.