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

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

http://site/gwturl#section1/section2

Некоторым разделам, возможно, понадобятся дополнительные атрибуты, которые мы хотели бы указать с a :, так, чтобы части раздела URL были однозначны. Код разделил бы сначала на /, затем на :, как это:

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

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

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

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

103
задан Stevoisiak supports Monica 13 March 2018 в 18:46
поделиться

8 ответов

Это пространство имен верхнего уровня.

Это очень похоже (но не идентично) на то, как работает имя каталога. Без ведущей двойной двоеточия C++ сначала проверяет наличие пространства имен с таким именем в текущем «активном» пространстве имен. Если нет, то будет выполнена проверка пространства имен на верхнем уровне.

В начале двоеточия C++ пропускает первую проверку и ищет только пространство имен верхнего уровня.

-121--2071953-

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

-121--745655-

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

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

Все символы во фрагменте ( 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 говорит только о том, что вы не отправляете эту часть на сервер.


ПРАВКА:

Д 'о!

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

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

77
ответ дан 24 November 2019 в 04:18
поделиться

Полковник не в безопасности. Смотрите здесь

0
ответ дан 24 November 2019 в 04:18
поделиться

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

3
ответ дан 24 November 2019 в 04:18
поделиться

из urlencoder javadoc:

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

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

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

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

4
ответ дан 24 November 2019 в 04:18
поделиться

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

-5
ответ дан 24 November 2019 в 04:18
поделиться

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

3
ответ дан 24 November 2019 в 04:18
поделиться

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

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

Так что вам повезло. «:» явно допускается. И никто не должен «%» - избежать его, не только потому, что «%» является незаконным символом, но и потому, что фрагмент гораздо сопоставлен анкерное имя CHAR-BY-CHAR, поэтому никакого агента не должно пытаться отказаться от них в любом случае.

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

58
ответ дан 24 November 2019 в 04:18
поделиться

Существует два способа реализации службы отображения, подобных описанному вами.

  1. Клиенты отправляют глобально уникальные идентификаторы, или
  2. Сервер генерирует глобально уникальные идентификаторы

Клиенты отправляют глобально уникальные идентификаторы

Насколько мне известно, 1. следует пытаться только с помощью Guid , если только вы не разработаете аналогичное средство для передачи достаточно четкой информации в короткий поток байтов. В любом случае, если у вас есть поток байтов, которые представляют глобально уникальный идентификатор, вы можете сделать что-то подобное

// source is either a Guid, or some other globally unique byte stream
byte[] bytes = Guid.NewGuid ().ToByteArray ();
string base64String = Convert.ToBase64String (bytes).Trim ("=");

, чтобы получить считываемую пользователем последовательность алфавитно-цифровых чисел, которая выглядит случайной, но избегает конфликтов, присущих другим случайным схемам. Guid содержит 16 байт или 128 бит, что соответствует приблизительно 19 символам для полной кодировки Base64.

Преимущество этого подхода в том, что клиенты могут генерировать свои собственные крошечные Uris без центрального органа. Минусом является большая длина, если вы катитесь с Guid или реализуете свой собственный глобально уникальный поток байтов, который - давайте посмотрим правде в глаза - склонен к ошибкам.

Если вы действительно идете по этому маршруту, рассмотрите глобально уникальные потоки байтов Google или такие. О, и ДЕРЖИТЕСЬ ПОДАЛЬШЕ ОТ СЛУЧАЙНЫХ БАЙТОВ , иначе вам придется построить разрешение коллизий ПОВЕРХ вашего крошечного генератора URI.

Сервер генерирует глобальные уникальные идентификаторы

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

Таким образом, если не считать серверно-ориентированного подхода, в котором единый орган власти генерирует и выдает идентификаторы, может быть более привлекательным. Если это выбранный маршрут, то вопрос только в том, как долго вы хотите ваш URI?

Предполагая желаемую длину 5 символов, и допустим, вы идете с Base64 кодировкой, каждый идентификатор может представлять до 5 символов на 7 бит на символ равно 35 бит или 2 ^ 35 [34 359 738 368] различных значений. Это довольно большой домен. *

Тогда возникает вопрос о возврате значения для данного представления. Вероятно, есть много способов сделать это, но я бы пошел с чем-то вроде этого,

  • Перечислить все возможные значения в «список свободных элементов» в базе данных
  • Удалить значение из списка свободных элементов при использовании
  • Добавить значение в список свободных элементов при выпуске

Усовершенствования или оптимизации могут включать

  • Не перечислять все значения в диапазоне [0, 2 ^ 35], вместо перечисления управляемого подмножества, скажем, 100 000 значений одновременно, и когда все значения будут израсходованы, просто создайте еще 100 000 значений в последовательности и продолжите
  • Добавьте дату истечения срока к значениям, и повторно использовать просроченные значения в конце дня
  • Распределите ваш сервис, когда параллелизация вашего сервиса просто распределяет небольшие взаимоисключающие подмножества вашего списка бесплатных услуг

Вывод

Итог:вы хотите гарантировать уникальность - так что коллизии являются большим нет-нет.


* = 34 359 738 368 - размер необработанного домена, это все идентификаторы от 0 длины до 5 длины. Если вы заинтересованы в ограничении всех идентификаторов минимальной и максимальной длиной 5, то ваш домен выглядит так, что все идентификаторы длиной от 0 до 5 (2 ^ 35) меньше всех идентификаторов длиной от 0 до 4 (2 ^ 28) составляет от 2 ^ 35 до 2 ^ 28 = 34 091 302 912, что все еще довольно велико:)

-121--432â6-

Вы говорите:

Для другого можно вернуть списки из функций, даже если вы никогда передан в списке при вызове функция и даже несмотря на то, что функция не содержит конструктор List, Например,

x = strsplit(LETTERS[1:10], "") # passing in an object of type 'character'
class(x)
# => 'list'

И я полагаю, вы предполагаете, что это проблема (?). Я здесь, чтобы сказать вам, почему это не проблема: -). Ваш пример немного прост, так как при разделении строки имеется список с элементами длиной 1 элемента, поэтому известно, что x [[1]] совпадает с unlist (x) [1] . Но что, если результат strsplit вернул результаты различной длины в каждой ячейке. Просто вернуть вектор (против списка) совсем не получится.

Например:

stuff <- c("You, me, and dupree",  "You me, and dupree",
           "He ran away, but not very far, and not very fast")
x <- strsplit(stuff, ",")
xx <- unlist(strsplit(stuff, ","))

В первом случае ( x : который возвращает список) можно указать, какой была 2-я «часть» 3-й строки, например: x [[3]] [2] . Как вы могли бы сделать то же самое с помощью xx теперь, когда результаты были «распутаны» ( unlist -ed)?

-121--54025-

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

7
ответ дан 24 November 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: