Является ли двоеточие: безопасным для использования дружественного 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. Однако для совместимости причины, если кодировка не указанная, то кодировка по умолчанию платформы.
То есть :
небезопасно.
Ответ 6
Я не вижу Firefox или IE8, кодирующие некоторые URL-адреса Wikipedia которые включают символ.
Ответ 7
Колонки используются как разделение между именем пользователя и паролем, если для протокола требуется аутентификация.
Ответ 8
Колон не безопасен. Смотрите здесь
Ответ 9
Это не безопасный символ и используется, чтобы отличить, к какому порту вы подключаетесь, когда он находится прямо после вашего имени домена