Вопрос проверяет понимание уязвимости SQL Injection и методов защиты от неё, что критично для безопасности веб-приложений.
SQL Injection — это тип атаки на веб-приложения, при котором злоумышленник вставляет или "инжектирует" вредоносный SQL-код в запрос к базе данных. Это происходит, когда приложение напрямую конкатенирует пользовательский ввод с SQL-запросом без должной обработки. Например, на странице входа злоумышленник может ввести в поле логина что-то вроде ' OR '1'='1, что превратит запрос в SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '...', и условие всегда будет истинным, позволяя обойти аутентификацию.
Основной метод защиты — использование параметризованных запросов (prepared statements). Они отделяют SQL-код от данных, передавая параметры отдельно, что не позволяет интерпретировать ввод как часть запроса. Также эффективно использование ORM (Object-Relational Mapping), которые автоматически экранируют ввод. Дополнительно стоит применять валидацию и экранирование ввода, а также ограничивать права пользователя базы данных минимально необходимыми.
Уязвимый код на PHP:
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);Безопасный код с prepared statements:
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();В безопасном варианте знаки вопроса заменяются на переданные значения, но они не интерпретируются как SQL-код.
SQL Injection — одна из самых опасных уязвимостей, но её легко предотвратить, используя параметризованные запросы или ORM. Всегда обрабатывайте пользовательский ввод как данные, а не как код, и следуйте принципу наименьших привилегий для базы данных.