Подтвердить что ты не робот

Escaping внутри значения атрибута тега html

У меня возникли проблемы с пониманием того, как escaping работает внутри значений атрибутов тега html, которые являются javascript.

Мне повезло, что вам всегда нужно убежать и "" < > . Поэтому для javascript как значения атрибута я попытался:

<a href="javascript:alert(&apos;Hello&apos;);"></a>

Это не работает. Однако:

<a href="javascript:alert(&#39;Hello&#39;);"></a>

и

<a href="javascript:alert('Hello');"></a>

работает во всех браузерах!

Теперь я совершенно смущен. Если все мои значения атрибутов заключены в двойные кавычки, значит ли это, что мне не нужно избегать одиночных кавычек? Или это просто и технически разные персонажи? Для того чтобы javascript требовал ascii 39, но не apos?

4b9b3361

Ответ 1

Здесь задействованы два типа "escapes", HTML и JavaScript. При интерпретации HTML-документа сначала выполняются синтаксисы HTML.

Что касается HTML, то правила внутри значения атрибута такие же, как в другом месте, плюс одно дополнительное правило:

  • Символ < должен быть экранирован. Обычно для этого используется &lt;. Технически, в зависимости от версии HTML, экранирование не всегда требуется, но оно всегда было хорошей практикой.
  • Амперсанд & должен быть экранирован. Обычно для этого используется &amp;. Это тоже не всегда обязательно, но проще делать это всегда, чем учиться и запоминать, когда это требуется.
  • Символ, который используется как разделители вокруг значения атрибута, должен быть экранирован внутри него. Если в качестве разделителя используется кавычка " Ascii, обычно ее можно избежать с помощью &quot;, тогда как для апострофа Ascii ссылка на объект &apos; определяется только в некоторых версиях HTML, поэтому безопаснее использовать числовое значение &#39; (или &#x27;).

Вы можете избежать > (или любого другого символа данных), если хотите, но это никогда не требуется.

На стороне JavaScript есть несколько механизмов эвакуации (с \) в строковых литералах. Но это другая проблема и не имеет отношения к вашему делу.

В вашем примере, в браузере, соответствующем текущим спецификациям, интерпретатор JavaScript видит точно такой же код alert('Hello');. Браузер имеет "unescaped" &apos; или &#39; до '. Я был несколько удивлен здесь, что &apos; в наши дни не поддерживается повсеместно, но это не проблема: редко нужно избегать апострофа Ascii в HTML (экранирование требуется только в значениях атрибутов, и только если вы используете Ascii апостроф в качестве разделителя), а когда есть, вы можете использовать ссылку &#39;.

Ответ 2

&apos; не является допустимым объектом HTML. Вам следует избегать использования &#39;

Ответ 3

Вы правы, что вам не нужно избегать одиночных кавычек, если ваш тег заключен в двойные кавычки. Когда я делаю код javascript в тегах (что редко встречается с jQuery), единственным символом, который я избегаю, является двойная цитата, браузеры обрабатывают остальное просто отлично.