@User782

Как безопасно отправлять пользовательский текст в базу POST запросом?

Каким максимально простым и безопасным способом фильтровать текст пользователя и отправлять в базу?
Что еще нужно добавить кроме:
htmlspecialchars($text)
  • Вопрос задан
  • 312 просмотров
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега PHP
Перед тем как что-то куда-то добавлять надо сначала разобраться что ты делаешь.
В частности понять что браузер, веб-сервер, и база данных - это разные вещи, и для каждой нужна своя обработка данных.

В-первых, POST запросом ничего добавить в базу нельзя.
База вообще ничего не знает про пост запросы. POST запросом можно отправить текст только в РНР.
А РНР уже будет добавлять в БД.

Про HTML база данных тоже ничего не знает. Поэтому "htmlspecialchars" к базе данных не имеет никакого отношения. И делать это для добавления в БД не нужно. Это функцию надо применять при выводе данных в браузер, а не при сохранении в базу данных.

Вот теперь, когда мы разобрались что у нас где, можно наконец ответить на твой вопрос

Для безопасного добавления данных в БД из РНР, надо отправлять их отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
И не важно - пользовательский у тебя текст, или какой-то другой, POST у тебя запрос, или вообще никакого запроса не было - все эти вещи к работе с БД из РНР не имеют никакого отношения. Важно только то, что данные всегда отправляются в БД отдельно от запроса.
Для этого надо
  • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
  • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
  • Привязать переменные к запросу.
  • Выполнить подготовленный ранее запрос с помощью с помощью execute()

В mysqli это будет так
$sql = "INSERT INTO  table (name, text, message, date, rating) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->bind_param("sssss", $name, $text, $message, $date);
$stmt->execute();

bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute
$sql = "INSERT INTO  table (name, text, message, date, rating) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->execute([$name, $text, $message, $date]);

А дураков, которые сами не знают, как текст в базу сохранить, слушать не надо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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