--- title: SQL Injection localeTitle: SQL-инъекция --- ## SQL-инъекция Уязвимость в приложении, вызванная тем, что программист не дезинфицирует ввод, прежде чем включать его в запрос в базу данных. Это приводит к тому, что злоумышленник имеет полное чтение и чаще всего не пишет доступ к базе данных. При таком типе доступа злоумышленник может делать очень плохие вещи. ### Пример атаки SQL Injection В приведенном ниже PHP-скрипте выполняется SQL-запрос для получения электронной почты пользователя по идентификатору. Однако вход не подвергается дезинфекции, что делает его уязвимым для SQL Injection ```PHP connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT email FROM users WHERE id =" . $input; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo $row["email"]; } } else { echo "no results"; } $conn->close(); ``` ```SQL SELECT email FROM users WHERE id = `$input`; ``` Таким образом, с вышесказанным вход не вводится в тип (т.е., вводя вход с (int), так что допускается только число) и не экранируется, позволяя кому-либо выполнять атаку SQL Injection - например, URL `getemailbyuserid.php?id=1'; My Query Here-- -` позволит вам запускать произвольные SQL-запросы без особых усилий. ### Защита вашего сайта от SQL-инъекций в PHP Существует несколько подходов к защите вашего сайта от SQL Injection Attacks. Этими подходами являются «Белый список», «Литье по типу» и «Экранирование символов» **Whitelisting:** Белый список используется в тех случаях, когда ожидаются только несколько входов. Вы можете перечислить каждый ожидаемый ввод в PHP Switch, а затем по умолчанию использовать недопустимый ввод. Вам не нужно беспокоиться о проблеме с литьем типа или обхода escape-кода персонажа, но разрешенный вход ограниченно ограничен. Он остается вариантом, см. Пример ниже. ```PHP