Должен ли я Html кодировать ввод Html от пользователя?

Мы разрабатываем приложение, которое принимает пользовательский ввод в виде HTML-кода и отображает тот же HTML-код в качестве вывода на другой странице. И вход никогда не должен иметь какого-либо динамического поведения, такого как теги скрипта.

Мы Html кодируем значение в Javascript и сохраняем закодированное значение в БД. Мы Html декодируем сохраненное значение и отображаем его на новой странице, чтобы получить ожидаемый результат (см. Пример ниже).

Из того, что я прочитал до сих пор, я должен кодировать ввод с помощью Html, прежде чем отображать его как вывод на другой странице. Проблема, с которой я сталкиваюсь, заключается в том, что любой HTML-код, добавленный пользователем, отображается одинаково на новой странице.

Пример:

Ввод данных пользователем:

<div><h2>Header</h2><p>this is the body text</p></div>

Вывод на новой странице, когда Html кодируется и назначается другому элементу div:

<div><h2>Header</h2><p>this is the body text</p></div>

Ожидается:

   Header
   this is the body text

Единственный способ, которым я смог добиться ожидаемого результата, - это когда я Html декодировал сохраненное значение и присвоил его другому элементу управления контейнером.

Я что-то упустил, я перепробовал все известные мне способы Html-кодирования пользовательского ввода и его обратного рендеринга не дает ожидаемого результата. Любая идея о том, как этого добиться?

Если нет другого решения, есть ли в .net какая-либо структура проверки, позволяющая избежать XSS-атак. Я прошел через инфраструктуру AntiXSS от Microsoft, они больше предназначены для удаления любого вредоносного html и кодирования. Они не помогают сообщить пользователю, что он не должен вводить некоторые теги.

Спасибо за любую помощь заранее.


person user3865301    schedule 30.12.2014    source источник


Ответы (2)


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

Причина, по которой существует рекомендация кодировать перед отображением, заключается в том, что если ожидается, что пользовательский ввод будет текстом, рекомендуется кодировать для общих целей отображения (чтобы амперсанд фактически отображался как &), а также для предотвращения потенциально вредоносного ввода от визуализации на страницы и интерпретируются браузером (например, теги <script>).

Пожалуйста, будьте осторожны: если вы собираетесь отображать HTML-код, предоставленный пользователем, который вы пытаетесь максимально очистить ввод, убедитесь, что он не пытается сделать что-то злонамеренное, а также чтобы убедиться, что они не сделают простой ошибки, которая может разрушить весь макет веб-страницы (например, иметь открывающий тег без закрывающего тега). Этот тип очистки — непростая задача, и это один из основных факторов, почему вообще существуют другие разновидности разметки (например, Mark Down, BBCode и т. д.).

person Brian Ball    schedule 30.12.2014
comment
Есть ли смысл сохранять закодированные значения, а затем снова декодировать их для вывода? - person user3865301; 31.12.2014
comment
Я предпочитаю не кодировать до сохранения в базе данных, потому что в будущем вы можете захотеть отобразить его в формате, отличном от HTML. - person Brian Ball; 06.01.2015

@Brian Ball ответил на вопрос, но я чувствую, что необходимы дополнительные пояснения.

Многочисленные и разнообразные протоколы кодирования зависят от контекста.

Насколько я понимаю, единственная точка HTMLencoding (в отличие от других протоколов кодирования, таких как URIencoding и т. д.) — позволить браузеру отображать текст «как есть», если он содержит элементы, которые в противном случае были бы проанализированы как HTML (например, символы & ‹ > / и двойные и одинарные кавычки). Endcoding «скрывает» эти символы от парсера HTML браузера.

Так что на самом деле единственное место, где HTMLencoding служит какой-либо цели, — это подготовка текста для отображения в браузере. Нет никакой цели в HTML-кодировании введенного пользователем текста, который направляется в базу данных. Вам может понадобиться использовать другие кодировки для передачи, для обеспечения надлежащей обработки серверными языками и т. д., но кодирование HTML не имеет места в этих контекстах.

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

Итак, простой ответ:

а. нет смысла HTML-кодировать введенные пользователем данные перед их сохранением в вашей базе данных, и б. если вы хотите, чтобы он отображался как HTML, а не выводился на экран «как есть», не кодируйте его в HTML перед отображением на другой странице.

person Nikkorian    schedule 27.04.2020