Приведён SQL-запрос: EXECUTE IMMEDIATE 'SELECT * FROM users WHERE id = ' || userInput; опишите риски безопасности и предложите безопасные альтернативы для предотвращения SQL-инъекций

11 Ноя в 09:34
3 +2
0
Ответы
1
Риски безопасности
- SQL‑инъекция: конкатенация строки делает запрос уязвимым — злоумышленник может подставить фрагмент SQL и изменить логику запроса (читать/удалять/изменять данные, выполнять DDL). Пример: если пользователь передаёт строку 1 OR 1=11 \text{ OR } 1=11 OR 1=1, итоговый запрос становится `SELECT * FROM users WHERE id = 1 OR 1=1` и вернёт все строки.
- Стекинг запросов: при поддержке множества команд в одном запросе можно выполнить `; DROP TABLE users;`.
- Утечка данных, обход аутентификации, эскалация привилегий, удалённое выполнение команд (в зависимости от СУБД и настроек).
- Логирование и аудит: вредоносные запросы могут остаться незамеченными без фильтрации/валидации.
Безопасные альтернативы (кратко и практично)
1. Параметризованные запросы / подготовленные выражения (bind variables) — основное решение.
- Oracle PL/SQL (EXECUTE IMMEDIATE с USING):
EXECUTE IMMEDIATE 'SELECT name FROM users WHERE id = :id' INTO l_name USING userInput;
- Java (JDBC):
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
ps.setInt(1, Integer.parseInt(userInput)); // предварительная валидация
ResultSet rs = ps.executeQuery();
- Python (psycopg2):
cur.execute("SELECT * FROM users WHERE id = %s", (user_input,))
2. Валидировать и нормализовать ввод (allowlist, типизация)
- Для числовых id применять проверку/приведение: например, только целые числа: `id = Integer.parseInt(userInput)` или проверка регуляркой `^[0-9]+$`.
- Для имен таблиц/полей — только allowlist, т.к. идентификаторы нельзя биндать.
3. Минимизировать права и экспозицию
- Подключение к БД с минимально необходимыми правами (не использовать суперпользователя для приложения).
- Не использовать `SELECT *`, ограничивать возвращаемые столбцы и строки (LIMIT).
4. Безопасная динамика (если нужно динамически менять идентификаторы/имена)
- Для динамических идентификаторов — проверить по allowlist и потом конкатенировать; параметры только для значений.
- В Oracle можно использовать DBMS_ASSERT для валидации имен (но не полагаться как единственному средству).
5. Мониторинг и защита
- Логи запросов, WAF/IDS, лимиты таймаута/рсс, детектирование аномалий.
Короткий вывод: замените конкатенацию на параметризованные запросы (bind variables), добавьте валидацию/allowlist для всех входных данных и выполните политику наименьших привилегий — это существенно предотвращает SQL‑инъекции.
11 Ноя в 10:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир