Что такое SQL-инъекция

«Что такое SQL-инъекция» — вопрос из категории Безопасность, который задают на 38% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";

Если ввести ' OR '1'='1 в поле username, запрос превратится в:

SELECT * FROM users WHERE username='' OR '1'='1' AND password='...'

Это вернёт все записи из таблицы users.

Защита:

  1. Используйте подготовленные выражения (PDO/mysqli):
$stmt = $pdo->prepare("SELECT * FROM users WHERE username=:username AND password=:password");
$stmt->execute(['username' => $username, 'password' => $password]);
  1. Валидация и экранирование ввода.
  2. Принцип минимальных привилегий для БД.