Безопасно ли использовать двоеточие `:` для дружественных URL-адресов? - PullRequest
97 голосов
/ 13 января 2010

Мы разрабатываем систему URL, которая будет указывать разделы приложения в виде слов, разделенных косой чертой. В частности, это в GWT, поэтому соответствующие части URL будут в хэше (который будет интерпретирован уровнем контроллера на стороне клиента):

http://site/gwturl#section1/section2

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

http://site/gwturl#user:45/comments

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

http://site/gwturl#user%3A45/comments <--- BAD

Использует ли это двоеточие таким образом безопасно (под которым я подразумеваю, что оно не будет автоматически кодироваться) для браузеров, систем закладок, даже Javascript или Java-кода?

Ответы [ 9 ]

72 голосов
/ 13 января 2010

Я недавно написал кодировщик URL, так что это довольно свежо в моей памяти.

http://site/gwturl#user:45/comments

Все символы в фрагменте (user:45/comments) полностью допустимы для RFC 3986 URI.

Соответствующие части ABNF :

fragment      = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

Помимо этих ограничений, фрагментная часть не имеет определенной структуры, кроме той, которую предоставляет ваше приложение. Схема, http, говорит только о том, что вы не отправляете эту часть на сервер.


EDIT:

D'ой!

Несмотря на мои утверждения о спецификации URI, неопровержимый дает правильный ответ, когда указывает , что спецификация HTML 4 ограничивает имена / идентификаторы элементов .

Обратите внимание, что правила идентификатора меняются в HTML 5 . Ограничения URI по-прежнему будут применяться (на момент написания этой статьи существуют некоторые нерешенные проблемы, связанные с использованием URI в HTML 5).

56 голосов
/ 13 января 2010

В дополнение к анализу Макдауэлла по стандарту URI, помните также, что фрагмент должен быть действительным именем привязки HTML. Согласно http://www.w3.org/TR/html4/types.html#type-name

Жетоны ID и NAME должны начинаться с буква ([A-Za-z]) и может сопровождаться по любому количеству букв, цифр ([0-9]), дефисы ("-"), подчеркивание ("_"), двоеточия (":") и точки ( "").

Так что вам повезло. ":" явно разрешено. И никто не должен "%" - избегать его, не только потому, что "%" там недопустимый символ, но также и потому, что фрагмент во многом соответствует имени привязки char-by-char, поэтому ни один агент не должен пытаться умерить их в любом случае.

Однако вы должны проверить это. Веб-стандарты не соблюдаются строго, иногда стандарты противоречат друг другу. Например, HTTP / 1.1 RFC 2616 не допускает строку запроса в URL-адресе запроса, тогда как HTML создает ее при отправке формы методом GET. Все, что реализовано в реальном мире, побеждает в конце дня.

52 голосов
/ 11 января 2013

MediaWiki и другие вики-движки используют двоеточия в своих URL для обозначения пространств имен, без каких-либо серьезных проблем.

например http://en.wikipedia.org/wiki/Template:Welcome

7 голосов
/ 13 января 2010

Я бы на это не рассчитывал. Вероятно, многие пользовательские агенты закодируют URL как %3A.

4 голосов
/ 13 января 2010

С URLEncoder javadoc:

Для получения дополнительной информации о кодировке HTML-формы обратитесь к спецификации HTML .

При кодировании строки применяются следующие правила:

  • Буквенно-цифровые символы от «a» до «z», от «A» до «Z» и от «0» до «9»" оставаться прежним.
  • Специальные символы ".", "-", "*" и "_" остаются прежними.
  • Пробел "" преобразуется в знак плюс "+".
  • Все остальные символы небезопасны и сначала преобразуются в один или несколько байтов с использованием некоторой схемы кодирования.Затем каждый байт представлен трехсимвольной строкой «% xy», где xy - шестнадцатеричное представление байта из двух цифр.Рекомендуемая схема кодирования - UTF-8.Однако из соображений совместимости, если кодировка не указана, используется кодировка платформы по умолчанию.

То есть : небезопасно.

3 голосов
/ 13 января 2010

Двоеточие используется как разделение между именем пользователя и паролем, если протокол требует аутентификации.

3 голосов
/ 13 января 2010

Я не вижу, чтобы Firefox или IE8 кодировали некоторые из Википедии URL , которые включают символ.

0 голосов
/ 13 января 2010

Это небезопасный символ и используется для определения того, к какому порту вы подключаетесь, когда он находится сразу после вашего доменного имени

0 голосов
/ 13 января 2010

Двоеточие не безопасно. Смотрите здесь

...