Использование подготовленных операторов MySQL и возможность делать инъекции - PullRequest
0 голосов
/ 19 марта 2019

У меня есть форма для вставки данных в MySQL.

Я выполняю подготовленные операторы, чтобы сделать это, но каким-то образом я все еще могу сделать инъекцию. Я новичок в MySQL, поэтому я могу что-то упустить.

<?php

include_once 'db.php';

      $first = mysqli_real_escape_string($conn, $_POST['name']);
      $last = mysqli_real_escape_string($conn, $_POST['lastname']);
      $phone = mysqli_real_escape_string($conn, $_POST['phone']);
      $email = mysqli_real_escape_string($conn, $_POST['email']);
      $nif = mysqli_real_escape_string($conn, $_POST['nif']);
      $address = mysqli_real_escape_string($conn, $_POST['address']);
      $postal = mysqli_real_escape_string($conn, $_POST['postal']);
      $distrito = mysqli_real_escape_string($conn, $_POST['distrito']);

      $sql = "INSERT INTO clients (name, surname, phone, mail, nif_id, address, postal, distrito) VALUES (?, ?, ?, ?, ?, ?, ?, ?);";
      $stmt = mysqli_stmt_init($conn);
      if (!mysqli_stmt_prepare($stmt, $sql)) {
        echo "SQL error";
      } else {
        mysqli_stmt_bind_param($stmt, "ssssisss", $first, $last, $phone, $email, $nif, $address, $postal, $distrito);
        mysqli_stmt_execute($stmt);
      }

EDIT

Это происходит при запуске name=TEST&lastname=TEST&email=TEST&phone=9999999999&nif=&address=&postal=&distrito=Lisboa в файле выше через его URL https://.../includes/addclient.php

Я что-то упустил?

1 Ответ

1 голос
/ 19 марта 2019

Объединение всех комментариев ...

SQL-инъекция - это когда кто-то злонамеренно создает значение, которое добавляет оператор SQL.Это важно только при построении SQL-запросов с использованием конкатенации строк.Например ...

$first = $_POST['name'];
$last = $_POST['lastname'];
$sql = "INSERT INTO clients (name, surname) VALUES ('$first', '$last')";

Если кто-то утверждает, что его имя Foo и его фамилия '); delete from clients; select(', у вас есть проблема.

INSERT INTO clients values ('Foo', ''); delete from clients; select('');

Есть два способазащититься от этого.Во-первых, нужно избегать всего, что может быть метасимволом SQL, например кавычки и точки с запятой.Это то, что mysqli_real_escape_string пытается сделать.

  $first = mysqli_real_escape_string($conn, $_POST['name']);
  $last = mysqli_real_escape_string($conn, $_POST['lastname']);
  $sql = "INSERT INTO clients (name, surname) VALUES ('$first', '$last')";

Теперь, когда они перейдут в '); delete from clients; select(', он, вероятно, будет экранирован до \'\)\; delete from clients\; select\(\' стерилизации, так что он не сможет выпрыгнуть из него.цитаты.Это не на 100% эффективно, и это затрудняет аудит кода, чтобы убедиться, что вы учли все возможные векторы внедрения.

Лучший способ - использовать параметры связывания.Поскольку вы больше не объединяете строки, это полностью исключает проблему.Каждый параметр явно передается в базу данных в качестве значения.Это означает, что безопасно передавать параметры формы прямо внутрь. Сначала их экранирование может привести к искажению значений с дополнительными обратными слешами.

mysqli_stmt_bind_param($stmt, "ss", $_POST['name'], $_POST['lastname']);
mysqli_stmt_execute($stmt);

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

...