Які символи потрібно уникнути в HTML?


251

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

Я знайшов величезні списки символів втечі HTML, але не думаю, що їх потрібно уникати . Я хочу знати, що потрібно уникати.

Відповіді:


318

Якщо ви вставляєте текстовий вміст у свій документ у тому місці, де очікується 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 Проекту безпеки веб-додатків, щоб допомогти зрозуміти деякі проблеми, які вам потрібно мати на увазі.


2
Деякі значення атрибутів HTML також можуть мати особливе значення (JS / CSS). Отже, це також не стосується таких, наприклад: <p onclick="NOT-HERE">...</p>і <p style="NOT-HERE">...</p>.
geekley

21

Це залежить від контексту. Деякі можливі контексти в HTML:

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

Див. Чіт-лист із запобігання сценаріям сценаріїв OWASP , особливо " Чому я не можу просто за допомогою HTML-коду кодувати незавірені дані? " Та " Правила запобігання XSS ". Однак найкраще прочитати весь документ.


9

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

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)

Також ми можемо використовувати подвійну цитату (") як" і одинарну цитату (') як & apos

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

Символи втечі HTML: Повний список: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

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

Перехід на UTF-8 означає повторне збереження файлу:

Використання кодування символів UTF-8 для вашої сторінки означає, що ви можете уникнути необхідності в більшості ескадрів та просто працювати з символами. Однак зауважте, що для зміни кодування вашого документа недостатньо лише змінити декларацію кодування вгорі сторінки або на сервері. Вам потрібно повторно зберегти документ у кодуванні. Щоб допомогти зрозуміти, як це зробити за допомогою програми, прочитайте Налаштування кодування в веб-програмах для створення авторів.

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

Особливо корисною роллю для втечі є представлення символів, невидимих ​​або неоднозначних у поданні.

Одним із прикладів може бути знак Unicode U + 200F НАЗАД ПРАВО-НАЛЯВО. Цей символ може бути використаний для уточнення спрямованості в двонаправленому тексті (наприклад, при використанні арабської або івритської скриптів). Однак він не має графічної форми, тому важко помітити, де ці символи знаходяться в тексті, і якщо вони загублені чи забуті, вони могли б створити несподівані результати під час подальшого редагування. Використання (або його цифровий посилання еквівалент) замість цього дозволяє дуже легко помітити ці символи.

Прикладом неоднозначного символу є U + 00A0 NO-BREAK SPACE. Цей тип простору запобігає розриву рядків, але він виглядає так само, як і будь-який інший простір, коли використовується як символ. Використання дає зрозуміти, де такі тексти з’являються в тексті.


3

Точна відповідь залежить від контексту. Загалом, ці символи не повинні бути присутніми ( HTML 5.2 §3.2.4.2.5 ):

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

Для елементів у HTML, обмеження моделі текстового вмісту також залежать від виду елемента. Наприклад, "<" всередині елемента textarea не потрібно уникати в HTML, оскільки textarea - це необроблений текстовий елемент.

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

... не повинно містити символів буквального простору, жодних символів U + 0022 QUOTATION MARK ("), U + 0027 символів APOSTROPHE ('), U + 003D EQUALS SIGN SIGN (=), U + 003C МЕНШИМИ ЗНАЧЕННЯХ символів ( <), U + 003E GREATER-THAN SIGN символів (>) або U + 0060 GRAVE ACCENT символів (`), і не повинно бути порожнім рядком.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.