Elena0394
@Elena0394

Нужно ли в таких случаях делать защиту от инъекций?

Полей в бд у меня всего два: имя и телефон.
Подключаюсь и создаю так:
$name= $_POST['name'];
$tel = $_POST['tel'];
$connect = mysqli_connect('localhost', 'root', 'password, 'bd');
mysqli_query($connect, "INSERT INTO `bd` (`id`, `name`, `tel`) VALUES (NULL, '$name', '$tel')");


Редактирую телефон:
$tel = $_POST['tel'];
$user = mysqli_query($connect, "SELECT * FROM `bd` WHERE `tel` = '$tel'");
$user = mysqli_fetch_array($user);
$user_id = $user['id'];
$user = mysqli_query($connect, "UPDATE `bd` SET `tel` = '$tel'  WHERE `bd`.`id` = $user_id");


И это все. Больше ничего не будет
  • Вопрос задан
  • 138 просмотров
Решения вопроса 4
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Нужно, разумеется.
Это как в одном пошлом анекдоте про поручика Ржевского,
- Запрос есть? Значит нужно.

Если кажется, что защита слишком сложная, то либо вариант предложенный Сергей delphinpro в комментариях,
$stmt = mysqli_prepare($connect, "INSERT INTO `bd` (`id`, `name`, `tel`) VALUES (NULL, ?, ?)");
mysqli_stmt_execute($stmt, [$_POST['name'],  $_POST['tel']]);

Либо, поскольку это ещё не везде работает, пишется маленькая функция на 5 строк, и кладётся в файл, где прописано соединение с БД
function prepared_query($mysqli, $sql, $params, $types = "")
{
    $types = $types ?: str_repeat("s", count($params));
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param($types, ...$params);
    $stmt->execute();
    return $stmt;
}

И дальше просто
$sql = "INSERT INTO `bd` (`name`, `tel`) VALUES (?,?)";
prepared_query($connect, $sql, [$_POST['name'], $_POST['tel']]);

Просто, быстро, аккуратно, безопасно
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
во первых - у вас ошибка в коде, отсутствует кавычка: 'password,
Во вторых - вопрос в корне не верный, если мы говорим о коде. Основное правило при работе с данными от пользователя - данным от пользователя нельзя доверять никогда.
Отсюда же и второе правило - любые данные в запросах, если это переменные пришедшие из кода, а не прописанные буквами и цифрами в запросе, должны быть через подготовленные выражения, вы не можете гарантировать что где-то не пропустите пользовательский ввод в запрос.
Ответ написан
Комментировать
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Нужно!!!
Ответ написан
Комментировать
@alexalexes
Помимо наличия возможности использовать инъекции есть еще один момент.
Если у вас форма на редактирование, то хорошо бы, чтобы она имела скрытое поле id той записи, которую редактируете, в данном случае нужно принять user_id через POST и уже сразу делать обновление по известному телефону и user_id:
$user_id = $_POST['user_id'];
$tel = $_POST['tel'];
$user = mysqli_query($connect, "UPDATE `bd` SET `tel` = '$tel'  WHERE `bd`.`id` = $user_id");

Но есть еще одни нюанс. Если такую запись редактирует администратор (пользователь с самыми широкими правами), то доверять передачи $user_id через форму можно.
Если такую запись редактирует тот же самый пользователь, который авторизован в системе, то доверять $user_id параметру из формы опасно, user_id нужно брать из сессии авторизации.
$user_id = /* Нужно какой-то функцией забрать идентификатор пользователя из сессии авторизации */;
$tel = $_POST['tel'];
$user = mysqli_query($connect, "UPDATE `bd` SET `tel` = '$tel'  WHERE `bd`.`id` = $user_id");
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы