Какие еще символы кроме амперсанда (&) должны быть закодированы в атрибутах HTML href / src? - PullRequest
6 голосов
/ 17 сентября 2011

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

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

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

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

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

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

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

Ответы [ 5 ]

9 голосов
/ 17 сентября 2011

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

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

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

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

Так что вам нужно указать & as & amp; чтобы этого не происходило со ссылками в разобранном HTML-документе.

1 голос
/ 20 сентября 2011

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

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

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

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

1 голос
/ 17 сентября 2011

Вам не нужен 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

1 голос
/ 17 сентября 2011

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

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

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

?q=whatever&lang=en

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

q = "whatever"
lang = "en"

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

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

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

http://jsfiddle.net/YjPHA/1/

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

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

0 голосов
/ 17 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...