Какие еще символы, кроме амперсанда ( & ), должны быть закодированы в атрибутах HTML href/src?
Является ли амперсанд единственным символом, который должен быть закодирован в атрибуте HTML?
Хорошо известно, что это не пройдет проверку:
<a href="http://domain.com/search?q=whatever&lang=en"></a>
Потому что амперсанд должен быть &
. Вот прямая ссылка на ошибку проверки.
Этот парень перечисляет кучу символов , которые должны быть закодированы, но он ошибается. Если вы закодируете первое " / " в http://
, то href не будет работать.
В ASP.NET, существует ли вспомогательный метод, уже построенный для обработки вот это? Что-то вроде сервера.UrlEncode и HtmlEncode явно не работают - Они предназначены для разных целей.
Я могу построить свой собственный простой метод расширения (например, .ToAttributeView()
), который выполняет простую замену строки.
5 ответов:
Кроме стандартного URI кодирования значений, & является единственным символом, связанным с HTML-сущностями, о котором вам нужно беспокоиться просто, потому что это символ, который начинается с каждой HTML-сущности. Возьмем для примера следующий URL:
http://query.com/?q=foo<=bar>=baz
Несмотря на то, что не существует конечных точек с запятой, так как является сущностью для >, некоторые старые браузеры переводили бы этот URL в:
http://query.com/?q=foo<=bar>=baz
Поэтому вам нужно указать & as &, чтобы предотвратить это для ссылки в HTML-анализируемом документе.
Цель экранирования символов состоит в том, чтобы они не обрабатывались в качестве аргументов. Таким образом, вы на самом деле не хотите кодировать весь url, только значения, которые вы передаете через строку запроса. Например:
http://example.com/?parameter1=<ENCODED VALUE>¶meter2=<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, а за
&
следует текст, который может быть интерпретирован как ссылка на сущность (например,©
). Вот тест в jsfiddle, показывающий url:В Хроме и FireFox ссылки работает корректно, но IE отображает
©
как ©, разрывая ссылку. Я должен признать, что у меня никогда не было проблем с этим в дикой природе (это повлияло бы только на те ссылки на сущности, которые не требуют точки с запятой, что является довольно небольшим подмножеством).Чтобы убедиться, что вы в безопасности от этой ошибки, вы можете кодировать 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).
Если я правильно понял вопрос, я считаю, что это то, что вы хотите.