flawopen.com/SQL-инъекция/Javascript
Представьте форму, ожидающую номер квитанции. Злоумышленник вводит команду, которая заставляет базу выдать вообще все записи, потому что система не проверила формат ввода.
SQL-инъекция возникает при включении пользовательского ввода напрямую в тело запроса. В Node.js это чаще всего происходит из-за удобных шаблонных строк.
В 2015 году британский провайдер TalkTalk допустил утечку данных 150 000 клиентов через SQL-инъекцию и был оштрафован на 400 000 фунтов.
Источник: Отчет ICO Великобритании, 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];
}
Драйвер базы данных компилирует структуру запроса до того, как в нее подставляются значения, исключая их выполнение как команд.
mysql2 использует знак вопроса (?), а драйвер pg — нумерованные маркеры ($1, $2).
Ручное экранирование уязвимо к проблемам с кодировками; используйте исключительно параметризацию.
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.Да, за исключением случаев вызова $queryRawUnsafe с интерполяцией строк.