Какие еще символы, кроме амперсанда ( & ), должны быть закодированы в атрибутах HTML href/src?


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

Хорошо известно, что это не пройдет проверку:

<a href="http://domain.com/search?q=whatever&lang=en"></a>

Потому что амперсанд должен быть &amp;. Вот прямая ссылка на ошибку проверки.

Этот парень перечисляет кучу символов , которые должны быть закодированы, но он ошибается. Если вы закодируете первое " / " в http://, то href не будет работать.

В ASP.NET, существует ли вспомогательный метод, уже построенный для обработки вот это? Что-то вроде сервера.UrlEncode и HtmlEncode явно не работают - Они предназначены для разных целей.

Я могу построить свой собственный простой метод расширения (например, .ToAttributeView()), который выполняет простую замену строки.

5 6

5 ответов:

Кроме стандартного URI кодирования значений, & является единственным символом, связанным с HTML-сущностями, о котором вам нужно беспокоиться просто, потому что это символ, который начинается с каждой HTML-сущности. Возьмем для примера следующий URL:

http://query.com/?q=foo&lt=bar&gt=baz

Несмотря на то, что не существует конечных точек с запятой, так как является сущностью для >, некоторые старые браузеры переводили бы этот URL в:

http://query.com/?q=foo<=bar>=baz

Поэтому вам нужно указать & as &, чтобы предотвратить это для ссылки в HTML-анализируемом документе.

Цель экранирования символов состоит в том, чтобы они не обрабатывались в качестве аргументов. Таким образом, вы на самом деле не хотите кодировать весь url, только значения, которые вы передаете через строку запроса. Например:

http://example.com/?parameter1=<ENCODED VALUE>&parameter2=<ENCODED VALUE>

Url, который вы показали, на самом деле является абсолютно корректным url, который пройдет проверку. Однако браузер будет интерпретировать символы & как разрыв между параметрами в строке запроса. Итак, ваша строка запроса:

?q=whatever&lang=en

Будет фактически переведен получателем как два параметра:

q = "whatever"
lang = "en"

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

?q=<ENCODED VALUE>&lang=<ENCODED VALUE>

Edit : страница common problems из W3C, на которую вы ссылаетесь, говорит о крайних случаях, когда URL-адреса отображаются в html, а за & следует текст, который может быть интерпретирован как ссылка на сущность (например, &copy). Вот тест в jsfiddle, показывающий url:

Http://jsfiddle.net/YjPHA/1/

В Хроме и FireFox ссылки работает корректно, но IE отображает &copy как ©, разрывая ссылку. Я должен признать, что у меня никогда не было проблем с этим в дикой природе (это повлияло бы только на те ссылки на сущности, которые не требуют точки с запятой, что является довольно небольшим подмножеством).

Чтобы убедиться, что вы в безопасности от этой ошибки, вы можете кодировать HTML любой из ваших URL-адресов, которые вы отображаете на странице, и вы должны быть в порядке. Если вы используете ASP.NET метод HttpUtility.HtmlEncode должен работать просто отлично.

Вам не нужен HTML-эскейп здесь:

<a href="http://domain.com/search?q=whatever&lang=en"></a>

Согласно спецификации HTML5: http://www.w3.org/TR/html5/tokenization.html#character-reference-in-attribute-value-state

&lang= должен быть проанализирован как непризнанная ссылка на символ и значение атрибута должно использоваться так, как оно есть: http://domain.com/search?q=whatever&lang=en

Для справки: добавлен вопрос к HTML5 WG: http://lists.w3.org/Archives/Public/public-html/2011Sep/0163.html

В значениях атрибутов HTML, если вы хотите ", ' & 'и неразрывное пространство в качестве результата , вы должны (как автор, который ясно понимает намерение) иметь", & и в разметке.

Для " хотя, вы не должны использовать ", если вы используете одинарные кавычки для упаковки значений атрибутов.

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

Для hfnames и hfvalues (и имена каталогов в пути) для URI я использовал кодировку Javascript encodeURIComponent () (на странице utf-8 при кодировании для использования на странице utf-8).

Если я правильно понял вопрос, я считаю, что это то, что вы хотите.