it-swarm.com.ru

Какие символы необходимо экранировать в HTML?

Являются ли они такими же, как XML, возможно, плюс пробел ( )?

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

208
Ahmet

Если вы вставляете текстовый контент в документ в месте, где ожидается текстовый контент1, обычно вам нужно экранировать только те же символы, что и в XML . Внутри элемента это просто включает в себя экранирующий объект амперсанд & и разделитель элементов со знаками "меньше и больше" <>:

& becomes &amp;
< becomes &lt;
> becomes &gt;

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

" becomes &quot;
' becomes &#39;

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

Если кодировка вашего документа не поддерживает все символы, которые вы используете, например, если вы пытаетесь использовать эмодзи в документе в кодировке ASCII, вам также необходимо их избежать. Большинство документов в наши дни кодируются с использованием полностью поддерживающей Unicode кодировки UTF-8, где это не требуется.

В общем, вы не должны экранировать пробелы как &nbsp;. &nbsp; - это не обычный пробел, это неразрывный пробел . Вы можете использовать их вместо обычных пробелов, чтобы предотвратить вставку разрыва строки между двумя словами или для вставки лишнего пробела без его автоматического свертывания, но обычно это редкий случай. Не делайте этого, если у вас нет конструктивных ограничений, которые этого требуют.


1 Под "местом, где ожидается текстовое содержимое", я подразумеваю значение элемента или атрибута в кавычках, где применяются обычные правила анализа. Например: <p>HERE</p> или <p title="HERE">...</p>. То, что я написал выше , не относится к содержимому, которое имеет специальные правила синтаксического анализа или значение, например, внутри скрипта или тега стиля, или как элемент или имя атрибута. Например: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script> или <p NOT-HERE="...">...</p>.

В этих условиях правила являются более сложными, и гораздо проще внедрить уязвимость безопасности. Я настоятельно не рекомендую вам когда-либо вставлять динамический контент в любое из этих мест. Я видел, как команды компетентных разработчиков, осведомленных о безопасности, вводили уязвимости, предполагая, что они имели правильно закодировал эти значения, но пропустил регистр Edge. Обычно существует более безопасная альтернатива, например, добавление динамического значения в атрибут и последующая обработка его с помощью JavaScript.

Если вам необходимо, прочитайте Правила предотвращения XSS проекта Open Web Application Security , чтобы помочь понять некоторые проблемы, которые вам необходимо учитывать.

250
Jeremy

Это зависит от контекста. Некоторые возможные контексты в HTML:

  • тело документа
  • внутри общих атрибутов
  • внутри тегов сценария
  • теги внутри стиля
  • еще несколько!

См. OWASP Шпаргалка по предотвращению межсайтовых сценариев , особенно " Почему я не могу просто кодировать HTML-объекты ненадежными данными? " и " Правила предотвращения XSS = "разделы. Однако лучше всего прочитать весь документ.

20
daxelrod

По сути, есть три основных символа , которые всегда должны быть экранированы в ваших файлах HTML и XML, чтобы они не взаимодействовали с остальными разметками, так что, как вы, вероятно, ожидаете, два из них будут синтаксическими обертками, которые являются <>, они перечислены ниже:

 1)  &lt; (<)

 2)  &gt; (>)

 3)  &amp; (&)

Также мы можем использовать двойную кавычку (") как" и одинарную кавычку (') как & apos

Избегайте размещения динамического содержимого в <script> и <style>. Эти правила не применяются для них. Например, если вам необходимо включить JSON в a, замените <на\x3c, символ U + 2028 на\u2028, а U + 2029 на\u2029 после сериализации JSON.)

Escape-символы HTML: полный список: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Таким образом, вам нужно экранировать <, или &, если за ним следует что-либо, что может начинать ссылку на символ. Кроме того, правило для амперсандов - единственное такое правило для атрибутов в кавычках, так как совпадающая кавычка - единственное, что завершает один. Но если вы не хотите завершать значение атрибута там, не используйте кавычки.

Переход на UTF-8 означает повторное сохранение файла:

Использование кодировки символов UTF-8 для вашей страницы означает, что вы можете избежать необходимости в большинстве экранирований и просто работать с символами. Однако обратите внимание, что для изменения кодировки вашего документа недостаточно просто изменить объявление кодировки в верхней части страницы или на сервере. Вам необходимо повторно сохранить документ в этой кодировке. Чтобы понять, как это сделать с вашим приложением, прочитайте раздел Настройка кодировки в приложениях веб-разработки.

Невидимые или неоднозначные символы:

Особенно полезная роль для экранирования заключается в представлении символов, которые невидимы или неоднозначны в представлении.

Одним из примеров может быть Unicode-символ U + 200F RIGHT-TO-LEFT MARK. Этот символ может использоваться для уточнения направленности в двунаправленном тексте (например, при использовании арабских или ивритских шрифтов). Однако он не имеет графической формы, поэтому трудно увидеть, где эти символы находятся в тексте, и если они будут потеряны или забыты, они могут привести к неожиданным результатам при последующем редактировании. Использование (или эквивалентный ему числовой символьный эквивалент) вместо этого позволяет очень легко обнаружить эти символы.

Примером неоднозначного символа является U + 00A0 NO-BREAK SPACE. Этот тип пробела предотвращает разрыв строки, но при использовании в качестве символа выглядит как любой другой пробел. Использование делает совершенно ясным, где такие места появляются в тексте.

8
Alireza

Точный ответ зависит от контекста. Как правило, эти символы не должны присутствовать ( HTML 5.2 §3.2.4.2.5 ):

Текстовые узлы и значения атрибутов должны состоять из символов Unicode, не должны содержать символы U + 0000, не должны содержать неопределенно неопределенные символы Unicode (не символы) и не должны содержать управляющие символы, кроме пробелов. Эта спецификация включает дополнительные ограничения на точное значение узлов Text и значений атрибутов в зависимости от их точного контекста.

Для элементов в HTML ограничения модели содержимого Text также зависят от типа элемента. Например, "<" внутри элемента textarea не нужно экранировать в HTML, потому что textarea является экранируемым необработанным текстовым элементом.

Эти ограничения разбросаны по спецификации. Например, значения атрибута ( §8.1.2. ) не должны содержать неоднозначный амперсанд и быть либо (i) пусто, (ii) в одинарных кавычках (и, следовательно, не должно содержать U + 0027 символа APOSTROPHE '), (iii) в двойных кавычках (не должен содержать символ U + 0022 MARK QUOTATION MARK ") или (iv) без кавычек - со следующими ограничениями:

... не должно содержать буквенных пробелов, любых символов U + 0022 QUOTATION MARK ("), символов U + 0027 APOSTROPHE ('), символов U + 003D EQUALS SIGN (=), символов U + 003C LESS-THAN SIGN ( <), Символы U + 003E GREATER-THAN SIGN (>) или символы U + 0060 Grace ACCENT (`), и не должны быть пустой строкой.

1
Andrey