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

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

http://site/gwturl#section1/section2 

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

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

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

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

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

9 Solutions collect form web for “Является ли двоеточие `:` безопасным для использования дружественного URL-адреса?”

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

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

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

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

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

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


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

D’о!

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

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

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

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

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

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

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

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

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

Из URLEncoder javadoc:

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

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

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

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

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

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

Колон не безопасен. Глянь сюда

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

  • Каковы HTML и XML, специальные символы?
  • «Escape-space» escape-символ «\ b»: неожиданное поведение?
  • Как добавить символ маркера в TextView?
  • Interesting Posts

    Как вызвать параметризованный метод из JSP с использованием JSTL / EL

    Слабая переменная NSString не равна нулю после установки единственной сильной ссылки на nil

    Порядок приоритетности маршрутизатора в express.js

    Извлечь диапазон outlookирования из lme fit

    Не удалось выполнить com.google.android.gms play-services-auth: 11.4.0

    Можно ли постоянно отключать доступ в Интернет в Ubuntu?

    Изменить текст по умолчанию в типе ввода = «файл»?

    Разделить строку на каждую третью запятую в Java

    Есть ли какие-либо расширения или трюки, чтобы открыть несколько закрытых вкладок в Safari

    Изменение заголовков и заголовков iTerm2 в zsh

    LINQ Где игнорировать акцентуацию и случай

    В чем разница между ссылочным типом и типом значения в c #?

    Как настроить профиль пользователя при использовании django-allauth

    Как просмотреть результаты моих заданий cron?

    Сохранение определений функций шаблонов C ++ в файле .CPP

    Давайте будем гением компьютера.