Лучший способ обрабатывать смешанный HTML и пользовательский ввод?

В приложении PHP, которое я пишу, я хотел бы, чтобы пользователи вводили в тексте сочетание HTML и текста с заостренными скобками, но когда я показываю этот текст, я хочу, чтобы теги HTML отображались с помощью тегов, отличных от HTML. быть показаны литературно, например пользователь должен иметь возможность вводить:

<b> 5 > 3 = true</b>

при отображении пользователь должен увидеть:

5> 3 = верно

Как лучше всего это проанализировать, т.е. найти все скобки, отличные от HTML, преобразовать их в & gt; и & lt ;?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
301
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я бы рекомендовал, чтобы пользователи вводили разметку стиля BBcode, которую вы затем заменяли тегами html:

[b]This is bold[/b]
[i]this is italic with a > 'greater than' sign there[/i]

Это дает вам больше контроля над тем, как вы анализируете ввод пользователя в html, хотя я признаю, что это выглядит как ненужное бремя.

Однако на самом деле это не доходит до корня проблемы: если он хочет разрешить HTML / BBCode, ему придется иметь дело с XSS. Написать хороший синтаксический анализатор BBCode нетривиально; написание хорошего парсера HTML тем более.

Edward Z. Yang 19.11.2008 22:41

Лучшим способом было бы сделать наоборот: вместо того, чтобы находить скобки, отличные от HTML, и экранировать их, сначала избегайте всего, а затем ищите &lt;b&gt; и &lt;/b&gt; и снимайте экранирование только в этих особых случаях. Таким образом, вы не рискуете, что пользователь внедрит вредоносный HTML-код на вашу страницу (если вы попытаетесь скрыть только то, что необходимо, вы рискуете пропустить что-то важное).

Если вы разрешаете пользователю вводить HTML, вам нужно решить гораздо более серьезную проблему, чем несколько неэкранированных угловых скобок; HTML действительно сложно проверить и правильно отфильтровать, и если вы не сделаете это правильно, вы подвергнетесь атакам XSS. Я написал библиотеку, которая делает это; кто-то уже разместил ссылку на это здесь, поэтому я не буду повторяться.

Однако, чтобы ответить на ваш вопрос, наиболее надежный способ преобразования случайных угловых скобок в их экранированные формы - это синтаксический анализ HTML с помощью DOM / libxml, а затем его повторная сериализация. Все, что использует регулярные выражения или что-то подобное, будет обречено на неудачу из-за крайнего случая. Вы также можете написать свой собственный синтаксический анализатор, но это также потребует некоторой работы.

Другие вопросы по теме