Для чего зарезервирована точка с запятой в 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.