SQL-инъекция

SQL-инъекция — это тип атаки на веб-приложения, при которой злоумышленник внедряет вредоносный SQL код в запросы к базе данных через пользовательский ввод.

Как работает SQL-инъекция

  1. Приложение принимает пользовательский ввод
  2. Ввод напрямую подставляется в SQL запрос
  3. Злоумышленник вводит SQL код вместо обычных данных
  4. База данных выполняет внедренный код

Типы SQL-инъекций

  • In-band SQLi — результат атаки виден сразу
  • Blind SQLi — результат не виден, но можно делать выводы
  • Out-of-band SQLi — данные передаются через другие каналы

Пример уязвимого кода

1// УЯЗВИМЫЙ КОД - НЕ ИСПОЛЬЗУЙТЕ!
2String query = "SELECT * FROM users WHERE username = '" 
3               + userInput + "' AND password = '" + password + "'";
4
5// Если userInput = "admin'; DROP TABLE users; --"
6// Получается: SELECT * FROM users WHERE username = 'admin'; DROP TABLE users; --'

Методы защиты

  • Параметризованные запросы — использование placeholders
  • Stored procedures — хранимые процедуры
  • Валидация ввода — проверка пользовательских данных
  • Escaping — экранирование специальных символов
  • Least privilege — минимальные права для БД пользователя

Безопасный код

1// БЕЗОПАСНЫЙ КОД
2String query = "SELECT * FROM users WHERE username = ? AND password = ?";
3PreparedStatement pstmt = connection.prepareStatement(query);
4pstmt.setString(1, username);
5pstmt.setString(2, password);

FAQ

Как проверить приложение на SQL-инъекции?

Используй инструменты как SQLmap, Burp Suite, или проводи manual testing с различными payload'ами.