Объединение всех комментариев ...
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-инъекция.Все, что создает запрос с конкатенацией строк, является подозрительным, и существуют автоматические инструменты, которые могут предупредить вас об этом.