Для чего зарезервирована точка с запятой в URL-адресах?

на RFC 3986 URI: общий синтаксис spec перечисляет точку с запятой как зарезервированный (sub-delim) символ:

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

какова зарезервированная цель"; " точки с запятой в URIs? Если на то пошло, какова цель других суб-разделителей (я знаю только о целях"&", " + " и "=")?

6 ответов


есть объяснение в конце раздела 3.3.

помимо точечных сегментов в иерархические пути, сегмент пути считается непрозрачным общим синтаксис. URI производя применения часто используйте зарезервированные символы разрешено в сегменте разделять схема или специфичный для разыменования обработчик подкомпоненты. Например, точка с запятой ( " ;") и равно (" =") часто используются зарезервированные символы для разграничения параметров и параметр значения, применимые к этому сегменту. Запятая (",") является зарезервированным символом часто используется в аналогичных целях. Например, один производитель URI может используйте такой сегмент, как " name; v=1.1" указание ссылки на версию 1.1 "имени", тогда как другой мог бы используйте сегмент типа "name, 1.1" для укажите то же самое. Тип параметра может определяться схемой семантика, но в большинстве случаев синтаксис параметра специфичен для реализация в Ури алгоритм разыменования.

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

foo;bar;baz%3bqux

и интерпретировать его как три части:foo, bar, baz;qux. Если бы двоеточие не было зарезервированным символом,; и %3bбыло бы эквивалентно таким образом, URI будет неправильно интерпретироваться как четыре части:foo, bar, baz, qux.


намерение яснее, если вы вернетесь к старые версии спецификации:

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param ) 

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

Я считаю, что он имеет свое происхождение в FTP URIs.


раздел 3.3 охватывает это - это непрозрачный разделитель, который может использовать приложение для создания URI, если это удобно:

помимо точечных сегментов в иерархические пути, сегмент пути считается непрозрачным общим синтаксис. URI производя применения часто используйте зарезервированные символы разрешено в сегменте разделять схема или специфичный для разыменования обработчик подкомпоненты. Например, точка с запятой ( " ;") и равно (" =") зарезервированный символы часто используются для параметры и параметр delimit значения, применимые к этому сегменту. Этот запятая ( " ,"), зарезервированный символ часто используется в аналогичных целях. Для например, один производитель URI может использовать сегмент, такой как" name;v=1.1 " to указать ссылку на версию 1.1 "имя", в то время как другой может использовать сегмент, например "название, 1.1" для указания тот же. Типы параметров могут быть определяется специфичной для схемы семантикой, но в большинстве случаев синтаксис параметр характерные для реализация URI алгоритм разыменования.


есть некоторые соглашения вокруг его текущего использования, которые интересны. Они говорят, когда использовать точку с запятой или запятую. Из книги "RESTful Web Services":

используйте знаки препинания для разделения нескольких фрагментов данных на одном уровне иерархии. Используйте запятые, когда порядок элементов имеет значение, ... Используйте точку с запятой, когда порядок не имеет значения.


С 2014 года сегменты пути, как известно, способствуют отраженные атаки загрузки файлов. Предположим, у нас есть уязвимый API, который отражает все, что мы отправляем ему (URL был реальным, по-видимому, теперь исправлен):

https://google.com/s?q=rfd%22||calc||

{"results":["q", "rfd\"||calc||","I love rfd"]}

теперь это безвредно в браузере, поскольку это JSON, поэтому он не будет отображаться, но браузер скорее предложит загрузить ответ в виде файла. Теперь вот сегменты пути приходят на помощь (для атакующий):

https://google.com/s;/setup.bat;?q=rfd%22||calc||

все между точками с запятой (;/setup.bat;) будет не отправлено к веб-службе, но вместо этого браузер будет интерпретировать его как имя файла... чтобы сохранить ответ API. Теперь файл под названием setup.bat будет загружен и запущен, не спрашивая об опасности запуска файлов, загруженных из интернета (потому что он содержит слово "setup" на его имя). Содержимое будет интерпретироваться как пакетный файл Windows и


Я нашел следующие варианты использования:

его окончательный символ HTML entity:
https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

для использования одной из этих символьных ссылок на сущности в HTML или XML документ, введите амперсанд, за которым следует имя сущности и точка с запятой, например, & для амперсанда ("&").

Apache Tomcat 7 (или более новые версии?!) нам это как path parameter:
https://superevr.com/blog/2011/three-semicolon-vulnerabilities

Apache Tomcat является одним из примеров веб-сервера, который поддерживает " путь Параметры." Параметр path-это дополнительное содержимое после имени файла, разделены точкой с запятой. Любое произвольное содержимое после точки с запятой не влияет на целевую страницу веб-браузера. Это означает, что http://example.com/index.jsp; derp все равно вернет индекс.jsp, а не некоторая ошибка страница.

схема URI разделяет им MIME и данные:
https://en.wikipedia.org/wiki/Data_URI_scheme

оно может содержать опционный параметр набора символов, отделенный от предшествующая часть точкой с запятой (;).

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

и была ошибка в IIS5 и IIS6 для обхода загрузки файла restrictions:
https://www.owasp.org/index.php/Unrestricted_File_Upload

расширения файлов черного списка эта защита может быть обойдена: ... путем добавления символа с запятой после запрещенного расширения и перед разрешенным (например, " файл.гадюка.;jpg")

вывод:
Не используйте точки с запятой в URL-адресах, иначе они могут случайно создать HTML-объект или схему URI.