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


109

Ми розробляємо 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-коду?


Можливо, це гарна ідея уточнити (більш чітко), що ви використовуєте URL-адреси лише на стороні клієнта? Оскільки багато відповідей (як і у мене), здається, припускають, що ви збираєтесь надіслати URL-адресу серверу за допомогою HTTP.
Вегер

Відредагований, щоб додати пояснення, що використання фрагмента відбувається на стороні клієнта.
Ніколь

Мені цікаво: через 10 місяців ця схема URL-адреси працювала для вас? Я розглядаю можливість використання тієї ж схеми.
Джонатан Свінні

1
@Jonathan Swinney, на жаль, я перейшов від цього проекту (і компанії), хоча відповіді тут мене задовольнили, що це шлях. Якби я розпочав новий проект, я би скористався цією схемою, але я також би точно був би використаний, #!щоб вказати, що сторінки є стаціонарними - див. Googlewebmastercentral.blogspot.com/2009/10/… (Цю пропозицію було дотримано від важких користувачів AJAX, таких як Facebook)
Ніколь

Щойно я з’ясував, що WhatsApp виріже URL-адресу на першій двокрапці, тому, наприклад, зробить URL-адрес google Maps непридатним. Так що так, важливо уникнути цього.
Петруза

Відповіді:


84

Нещодавно я написав кодер URL, так що це досить свіже на мою думку.

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

Усі символи у фрагменті (( user:45/comments) є абсолютно законними для URI RFC 3986) .

Відповідні частини АБНФ :

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

Крім цих обмежень, фрагментна частина не має визначеної структури, крім тієї, яку надає ваша програма. Схема, http, говорить лише про те, що ви не надсилаєте цю частину серверу.


Редагувати:

D'oh!

Незважаючи на мої твердження про специфікацію URI, незаперечний дає правильну відповідь, коли він вказує, що специфікація HTML 4 обмежує імена / ідентифікатори елементів .

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


Я думаю, що ти щось робиш, чи можеш це пояснити трохи далі? Не надсилати це на сервер - це не проблема, як ми використовуємо GWT. Я просто не впевнений, що я зрозумів синтаксис, вказаний у цитованому розділі.
Ніколь

Але :це ген-делім, а не субделім.
bobince

1
Напіво-двокрапка є законною для pchar, тож, чи є вона в субделімі або gen-delim, це не проблема
Вегер

@bobince - :є в pchar, який є fragment, тому :дозволено. @Renesis - у Вікіпедії є стаття про ABNF en.wikipedia.org/wiki/ABNF Ви в основному переглядаєте список дозволених символів, де /означає АБО . Я не робив жодного програмування GWT, тому не знаю, як він використовує фрагментну частину URI.
Макдауелл

Останнє питання - чи маєте ви уявлення про реальне застосування цієї специфікації? Чи означає це, що браузери повинні / будуть ігнорувати (пропускати кодування) :у фрагменті?
Ніколь

59

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

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

Тож вам пощастило. ":" явно дозволено. І ніхто не повинен "%" - уникати цього не лише тому, що "%" є незаконним знаком там, а й тому, що фрагмент повинен відповідати якорному імені char-by-char, тому жоден агент не повинен намагатися втручатися в них жодним чином.

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


58

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

наприклад, http://en.wikipedia.org/wiki/Template: Вітаю


31
Найбільш відповідна відповідь. Всі ми знаємо, що те, що є у специфікаціях, мало стосується до реальності в веб-розробці. Ви не збираєтесь отримати набагато кращу гарантію "безпеки", ніж "це робить один з 10 найкращих веб-сайтів у світі".
Стівен Коллінз

1
@StevenCollins Не має більшого значення, ніж відповідь, дана за 3 роки до цього, в якій сказано абсолютно те саме :)
Мартін Джеймс

7

Я б на це не розраховував. Ймовірно, URL-код буде закодований, як %3Aі багато користувачів-агенти.


1
@arbales: Так. Деякі менш сумісні користувальницькі агенти залишать невідповідні URL-адреси без прихильності.
Асаф

4

Від URLEncoderjavadoc:

Для отримання додаткової інформації про кодування HTML-форм зверніться до специфікації HTML .

При кодуванні рядка застосовуються такі правила:

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

Тобто не :є безпечним.


3

Я не бачу Firefox або IE8, що кодують деякі URL-адреси Вікіпедії, які містять символ.


1
Опера також зберігає напівкрапку, але розраховувати на таку поведінку не дуже добре
Veger,

1
Ренез говорить про фрагмент URL-адреси, а не про шлях URL-адреси.
Gumbo

Вікіпедія була однією з моїх думок при написанні цього питання. Тоді його використання колонок технічно недійсне / небезпечне? Я часто бачу (і) у Вікіпедії URL-адреси, кодовані, але ніколи двокрапки, що не розгубило мене.
Ніколь

3
Машина Wayback: у багатьох своїх посиланнях - наприклад, web.archive.org/web/20080822150704/http://stackoverflow.com
barrowc

2

Колони використовуються як розділення між іменем користувача та паролем, якщо протокол вимагає автентифікації.


0

Колон не є безпечним. Дивіться тут


Ця сторінка не мотивує, чому вони не безпечні. Посилання, що посилається на RFC2396 , не говорить про те, що його також слід уникати. Також наданий сценарій перетворювача не кодує його (у Chrome 9 все одно).
Адам Ліндберг

Адаме, ти неправий. У ньому прямо зазначено, що і чому.
ktamlyn

-5

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.