Является ли двоеточие: безопасным для использования дружественного URL-адреса?

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

http://site/gwturl#section1/section2

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

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

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

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

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

Ответ 1

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

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

Все символы в фрагментарной части (user:45/comments) являются совершенно законными для URI RFC 3986.

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

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

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


РЕДАКТИРОВАТЬ:

D'о!

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

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

Ответ 2

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

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

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

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

Ответ 3

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

eg http://en.wikipedia.org/wiki/Template:Welcome

Ответ 4

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

Ответ 5

От URLEncoder javadoc:

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

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

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

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

Ответ 7

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

Ответ 9

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