2010-01-12 2 views
88

Мы разрабатываем систему URL, которая будет определять разделы приложения как слова, разделенные косой чертой. В частности, это в GWT, так что соответствующие части URL будет находиться в хэш (который будет интерпретирован слоем контроллера на стороне клиента):Является ли двоеточие безопасным для использования дружественного 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-кода?

+0

Может быть, это хорошая идея, чтобы указать (более четко), что вы используете URL-адреса только на стороне клиента? Поскольку многие ответы (как и мои), похоже, предполагают, что вы собираетесь отправлять URL-адрес на сервер с помощью HTTP. – Veger

+0

Отредактировано, чтобы добавить разъяснения, что использование фрагмента происходит на стороне клиента. – Nicole

+0

Мне любопытно: через 10 месяцев эта схема URL-адресов сработала для вас? Я рассматриваю возможность использовать ту же схему. –

ответ

66

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

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

Все персонажи в fragment part (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'Oh!

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

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

+0

Я думаю, что вы на что-то, можете ли вы объяснить это немного дальше? Не отправлять это на сервер не является проблемой, так как мы используем GWT. Я просто не уверен, что я четко разбираюсь в синтаксисе, указанном в разделе, который вы цитировали. – Nicole

+0

Но ':' это gen-delim, а не sub-delim. – bobince

+1

Полу-двоеточие является законным для pchar, поэтому вопрос о том, находится ли он в sub-delim или gen-delim, не является проблемой. – Veger

6

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

+5

* Много * агентов пользователя? – arbales

+1

@arbales: Да. Некоторые менее совместимые пользовательские агенты оставят неприемлемые URL-адреса без сохранения. – Asaph

4

От URLEncoder Javadoc:

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

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

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

То есть, : не является безопасным.

-1

Колон небезопасен. See here

+0

Эта страница не мотивирует, почему они небезопасны. Ссылка [RFC2396] (http://www.rfc-editor.org/rfc/rfc2396.txt) не говорит, что ее также следует избегать. Кроме того, предоставленный сценарий конвертера не кодирует его (в любом случае в Chrome 9). –

3

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

+1

Опера также хранит точку с запятой, но рассчитывать на такое поведение нехорошо. – Veger

+1

Renesis говорит об фрагменте URL-адреса, а не о URL-адресе. – Gumbo

+0

Википедия была одной из моих мыслей при написании этого вопроса. Является ли его использование двоеточий технически недействительным/небезопасным? Я обычно вижу (и) в URL-адресах Википедии закодированный, но никогда не двоеточие, что немного меня смутило. – Nicole

-4

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

3

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

49

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

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

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

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

+1

@ Неудачный - да, вы совершенно правы. – McDowell

40

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

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

+19

Наиболее релевантный ответ. Мы все знаем, что в спецификациях мало что связано с реальностью в веб-разработке. Вы не получите гораздо лучшую гарантию «безопасности», чем «делает один из 10 лучших сайтов в мире». –

 Смежные вопросы

  • Нет связанных вопросов^_^