Когда и как кодировать / декодировать HTML при взаимодействии с базой данных?

У меня есть веб-сайт, который работает на PHP и базы данных MySQL. Мне было интересно, как лучше всего обрабатывать ввод данных пользователем в отношении кодирования HTML (я хорошо знаю, что я должен сохранять полученные данные и декодировать их в выходных данных: это то, что я делаю) и, в частности, этот цикл:

  • пользователь регистрирует заполнение формы с полем имени пользователя, содержимое поля проверяется, отправляется и сохраняется в БД как есть (без HTML-кодирования), так как это потребуется для вывода HTML, XML, JSON, открытого текста и других форматов;
  • на любой странице, требующей отображения имени пользователя, оно будет выбрано из базы данных, закодировано в HTML и отображено на странице;
  • на определенной странице имя пользователя помещается в поле «значение» текстового ввода html: очевидно, это означает, что имя пользователя должно быть в кодировке HTML (в противном случае XSS и все эти фантастические вещи …). Однако это также означает, что если исходное имя пользователя было «però», текстовое поле будет <input value="per&ograve;"> и когда пользователь отправит его, сервер получит per&ograve; вместо però,

Теперь мой вопрос: должен ли сервер декодировать все полученные входные данные так, чтобы per&ograve; раскодируется в оригинал però?
Я сомневаюсь, что это будет означать, что если пользователь вводит &egrave; в качестве его имени пользователя он будет зарегистрирован как è и не так, как он на самом деле хотел …

Я знаю, что это не такая большая проблема (не знаю многих пользователей, которые хотели бы использовать специальные символы HTML, кодирующие литералы в своих именах пользователей …), но это озадачило меня, и я не смог найти полностью удовлетворительное решение.

0

Решение

Если я неправильно понял то, что вы спрашиваете, у вас, похоже, сложилось неверное представление о том, как выводить кодированные строки HTML в текстовые вводы. Вот основной пример того, что произойдет. Допустим, у вас есть пользователь, который хочет быть названным PB&amp;J, Конечно, это странно, но не каждый может выбрать красивое, не странное имя пользователя, такое как «Bonvi» или «Don’t Panic».

Таким образом, вы сохраните это в своей базе данных как есть.

Позже, когда вы используете его в другой форме, вы избегаете его для вывода.

<input type="text" name="username" value="<?= htmlspecialchars($username) ?>">

На вашей странице источник, вот увидишь

<input type="text" name="username" value="PB&amp;amp;J">

с амперсандом, преобразованным в сущность HTML. (Это то, что вы хотите, в случае, если они действительно хотели быть названы bob"><script>alert("però!")</script><p class="ha или что-то хуже.)

Но значение, отображаемое в текстовом поле, будет PB&amp;Jи когда пользователь отправляет форму, значение в $_POST['username'] будет PB&amp;J, не PB&amp;amp;J, Он не будет изменен на закодированное значение.

(Я использовал htmlspecialchars в этом примере, но то же самое применимо к вашему примеру, используя però с htmlentities.)

Я пытаюсь объяснить это в основном, поэтому я прошу прощения, если я вас неправильно понял — я не собираюсь звучать снисходительно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]