flawopen.com/SQL-инъекция/Javascript

SQL-инъекция in Javascript

Критический CWE-89 Draft — pending review
Language: English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia
Простыми словами

Представьте форму, ожидающую номер квитанции. Злоумышленник вводит команду, которая заставляет базу выдать вообще все записи, потому что система не проверила формат ввода.

Ключевые термины на этой странице
Шаблонная строка
Строки в обратных кавычках (`...`). При сборке SQL они приводят к уязвимой конкатенации.

Что происходит

SQL-инъекция возникает при включении пользовательского ввода напрямую в тело запроса. В Node.js это чаще всего происходит из-за удобных шаблонных строк.

Реальные последствия

В 2015 году британский провайдер TalkTalk допустил утечку данных 150 000 клиентов через SQL-инъекцию и был оштрафован на 400 000 фунтов.

Источник: Отчет ICO Великобритании, 2016.

Уязвимый код vs Безопасный

VULNERABLE
// 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];
}
FIXED
// 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' .
Run Semgrep with p/javascript ruleset in CI to catch unparameterized database queries automatically.

Чек-лист по безопасности

Часто задаваемые вопросы

Защищает ли Prisma от инъекций?

Да, за исключением случаев вызова $queryRawUnsafe с интерполяцией строк.

Источники и ссылки

Смотреть на: Javascript Python JavaScript Java Go PHP C# Rust
Смотрите также: Cross-Site Scripting Command InjectionPath Traversal