Какие символы необходимо экранировать в HTML? - PullRequest
215 голосов
/ 12 сентября 2011

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

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

Ответы [ 4 ]

259 голосов
/ 12 сентября 2011

Если вы вставляете текстовое содержимое в документ в месте, где ожидается текстовое содержимое 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>.

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

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

21 голосов
/ 12 сентября 2011

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

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

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

8 голосов
/ 02 мая 2017

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

 1)  &lt; (<)

 2)  &gt; (>)

 3)  &amp; (&)

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

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

HTML Escape Символы: завершеноСписок: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

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

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

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

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

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

Одним примером может быть символ Unicode U + 200F ПРАВАЯ ВЛЕВО.Этот символ может использоваться для уточнения направленности в двунаправленном тексте (например, при использовании арабских или ивритских шрифтов).Однако он не имеет графической формы, поэтому трудно увидеть, где эти символы находятся в тексте, и если они будут потеряны или забыты, они могут привести к неожиданным результатам при последующем редактировании.Использование (или эквивалентный ему числовой символьный эквивалент) вместо этого позволяет очень легко обнаружить эти символы.

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

1 голос
/ 11 апреля 2018

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

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

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

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

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

...