SQL-инъекция — это опасная уязвимость веб-приложений, которая позволяет злоумышленнику внедрять произвольный SQL-код в запросы к базе данных. Это происходит, когда приложение некорректно обрабатывает пользовательский ввод.
-- Опасный способ формирования запроса
DECLARE @userInput NVARCHAR(100) = 'admin'' OR ''1''=''1';
DECLARE @sql NVARCHAR(MAX) =
'SELECT * FROM Users WHERE username = ''' + @userInput + ''' AND password = ''' + @password + '''';
EXEC sp_executesql @sql;
Результат запроса:
SELECT * FROM Users WHERE username = 'admin' OR '1'='1' AND password = 'any_password'
Последствие: злоумышленник получает доступ без валидного пароля.
Классическая инъекция через пользовательский ввод
Инъекция через HTTP-заголовки
Слепая SQL-инъекция (Blind SQLi)
Инъекция второго порядка
Несанкционированный доступ
Утечка данных
' UNION SELECT username, password FROM Users --
Изменение данных
Выполнение команд ОС
'; EXEC xp_cmdshell 'format C:' --
-- Безопасный подход
DECLARE @username NVARCHAR(50) = @userInput;
SELECT * FROM Users WHERE username = @username;
CREATE PROCEDURE GetUser
@username NVARCHAR(50)
AS
BEGIN
SELECT * FROM Users WHERE username = @username;
END
'
→ ''
Обход аутентификации:
Ввод: admin' --
Запрос: SELECT * FROM Users WHERE username = 'admin' --' AND password = ''
Извлечение данных:
Ввод: ' UNION SELECT name, type FROM sysobjects --
Использование временных задержек для слепой инъекции:
'; IF (SELECT COUNT(*) FROM Users) > 100 WAITFOR DELAY '0:0:5' --
Резюмируем: SQL-инъекция остается одной из самых опасных уязвимостей веб-приложений. Защита строится на четырех китах: параметризованные запросы, строгая валидация ввода, минимальные привилегии и регулярное тестирование безопасности. Разработчики должны всегда помнить об этой угрозе при работе с пользовательским вводом.