Привязан SQL-запрос 'SELECT * FROM users WHERE name = \"' + userInput + '\";' Объясните риски, связанные с этим подходом, и опишите несколько способов предотвращения SQL-инъекций

27 Мар в 16:11
27 +1
0
Ответы
1
Проблема
- Конкатенация строки запроса с пользовательским вводом (как в примере) позволяет злоумышленнику подставить фрагменты SQL и изменить логику запроса — SQL-инъекция.
- Пример атаки: если пользователь введёт "' OR '1'='1", запрос станет
SELECT * FROM users WHERE name = '' OR '1'='1';
где выражение 1=11=11=1 делает условие истинным и вернёт все строки. Итоговые риски: раскрытие данных, модификация/удаление данных (например через stacked queries), обход аутентификации, эскалация прав, DoS, утечка через ошибки.
Как предотвращать (основные и надёжные меры)
1. Параметризованные запросы / подготовленные выражения (prepared statements)
- Всегда передавайте пользовательские значения как параметры, а не встраивайте в строку SQL.
- Примеры:
- PHP (PDO):
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute([$userInput]);
- Python (psycopg2):
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
- Node (mysql2):
connection.execute("SELECT * FROM users WHERE name = ?", [userInput])
- Это наиболее надёжный основной механизм.
2. ORM / query builders
- Используйте проверенные ORM/библиотеки, которые автоматически параметризуют значения.
3. Белые списки и валидация входных данных
- Для известных форматов (email, username, id) применяйте строгую валидацию/очистку (регулярные выражения, преобразование типов).
- Разрешать только необходимый набор символов/форматов.
4. Экранирование как запасной вариант
- Применяйте DB‑специфичные функции экранирования (например, mysqli_real_escape_string), только если параметризация невозможна. Это менее надёжно и легко ошибочно используется.
5. Минимизация прав (least privilege)
- Подключение к БД должно иметь минимальные права (только SELECT для чтения, без DROP/DELETE если не нужно).
6. Отключение выполнения нескольких команд (если поддерживается)
- Блокируйте stacked queries (несколько команд в одном запросе), если библиотека/СУБД это позволяет.
7. Логирование, обработка ошибок и мониторинг
- Не показывайте подробные SQL‑ошибки пользователю. Логируйте и мониторьте подозрительную активность, используйте WAF как дополнительный слой.
8. Тестирование и аудит
- Проводите автоматические сканы, ручной аудит и тесты на проникновение (включая blind/second‑order инъекции).
Резюме
- Главная защита — всегда использовать параметризованные запросы/prepared statements (или ORM). Дополнительно применять валидацию входа, минимальные привилегии, корректную обработку ошибок и периодические тесты безопасности.
27 Мар в 16:17
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир