freeCodeCamp/guide/russian/php/security/sql-injection/index.md

5.2 KiB
Raw Blame History

title localeTitle
SQL Injection SQL-инъекция

SQL-инъекция

Уязвимость в приложении, вызванная тем, что программист не дезинфицирует ввод, прежде чем включать его в запрос в базу данных. Это приводит к тому, что злоумышленник имеет полное чтение и чаще всего не пишет доступ к базе данных. При таком типе доступа злоумышленник может делать очень плохие вещи.

Пример атаки SQL Injection

В приведенном ниже PHP-скрипте выполняется SQL-запрос для получения электронной почты пользователя по идентификатору. Однако вход не подвергается дезинфекции, что делает его уязвимым для SQL Injection

<?php 
 $input = $_GET['id']; 
 $dbserver = "localhost"; 
 $dbuser = "camper"; 
 $dbpass = "supersecretcampsitepassword"; 
 $dbname = "freecodecamp"; 
 
 $conn = new mysqli($dbserver, $dbuser, $dbpass, $dbname); 
 
 if ($conn->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(); 
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 
 switch ($input) { 
  case "1": 
    //db query 1 
    break; 
  case "2": 
    //db query 2 
    break; 
  default: 
    // invalid input return error 
 } 

Тип Литье: Подход типа литья обычно используется для приложения с использованием числового ввода. Просто введите вход с (int) $input и допустимо только числовое значение.

Экранирование символов: Подход к экранированию персонажа будет избегать символов, таких как кавычки и косые черты, предоставленные пользователем для предотвращения атаки. Если вы используете MySQL Server и библиотеку MySQLi для доступа к своей базе данных, mysqli_real_escape_string($conn, $string) будет принимать два аргумента, соединение MySQLi и строку и будет надлежащим образом удалять вход пользователя для блокировки атаки на SQL-инъекцию , Точная функция, которую вы используете, зависит от типа базы данных и библиотеки php, которую вы используете, чтобы проверить документацию библиотеки php для получения дополнительной информации об экранировании ввода пользователя.

Дополнительная информация: