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");


И это все. Больше ничего не будет
  • Вопрос задан
  • 128 просмотров
Решения вопроса 4
Fockker
@Fockker Куратор тега 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");
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Nikita1244
Анонимный
Я считаю, если ПОЛЬЗОВАТЕЛЬ ОТПРАВЛЯЕТ КАКИЕ ТО ДАННЫЕ на сервер, и какие то данные нужно сохранить в базе данных, то ОБЯЗАТЕЛЬНО нужна защита от инъекции. ЕСЛИ данные НЕ ЗАВИСЯТ ОТ ОТПРАВЛЕННЫХ ДАННЫХ пользователем, защита от иньекции необязательна.
Ответ написан
Ваш ответ на вопрос

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

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