Должен ли атрибут данных тега объекта быть закодирован в процентах?
-
14-11-2019 - |
Вопрос
Предположим, мое веб-приложение отображает следующий тег:
<object type="application/x-pdf" data="http://example.com/test%2Ctest.pdf">
<param name="showTableOfContents" value="true" />
<param name="hideThumbnails" value="false" />
</object>
Должен data
атрибут должен быть экранирован (путь в процентном кодировании) или нет?В моем примере это так.Никаких спецификаций я не нашел.
дополнение
На самом деле, меня интересует спецификация того, что должны потреблять плагины браузера. data
атрибут ожидайте увидеть там.Например, плагин Adobe Acrobat принимает как экранированные, так и неэкранированные URI.Однако, QWebPluginFactory лечит data
атрибут как удобочитаемый URI (неэкранированный), что приводит к двойному процентному кодированию.И мне интересно, является ли это ошибкой QWebPluginFactory
или нет.
Решение
А data
атрибут ожидает, что значение будет URI.Поэтому вам следует предоставить значение, которое является синтаксически допустимым URI.
Текущая спецификация URI: РФК 3986.Чтобы увидеть, ,
в пути URI необходимо закодировать, посмотрите, как путь правило производства определяется:
path = path-abempty ; begins with "/" or is empty / path-absolute ; begins with "/" but not "//" / path-noscheme ; begins with a non-colon segment / path-rootless ; begins with a segment / path-empty ; zero characters
Поскольку у нас есть URI с власть информацию, нам нужно взглянуть на Путь-пустой (видеть URI правило производства):
path-abempty = *( "/" segment )
сегмент равен нулю или больше pchar символов, который определяется следующим образом (правила производства я уже расширил):
pchar = ALPHA / DIGIT / "-" / "." / "_" / "~" / "%" HEXDIG HEXDIG / "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" / ":" / "@"
И как вы можете видеть, pchar расширяется до буквального ,
.Поэтому вам не нужно кодировать ,
в путь компонент.Но поскольку вам разрешено кодировать любой неразграничивающий символ, используя процентную кодировку, не меняя его значения, можно использовать %2C
вместо ,
.
Другие советы
URL-адреса обычно могут содержать только определенные символы.К сожалению, разные спецификации содержат разные списки символов, которые считаются зарезервированными и поэтому не могут использоваться.
В вашем примере закодированный символ представляет собой запятую (,
), который в некоторых спецификациях является зарезервированным символом, поэтому его кодирование не является ошибкой.
Большинство веб-серверов должны одинаково обрабатывать как незакодированные, так и закодированные запятые, однако некоторые из них могут этого не делать, в зависимости от их конфигурации.В связи с этим, как правило, рекомендуется избегать использования специальных символов в именах файлов (как в вашем примере).
Кодирование URL-адреса всегда необходимо, если в параметрах GET есть специальные символы.Например, параметр GET, который можно принять C&A
в качестве значения должно быть записано как:
http://example.com/somescript.php?value=C%26A
РЕДАКТИРОВАТЬ:
Плагинам (или даже браузеру) все равно.Они не пытаются (или не должны) расшифровывать это или что-то в этом роде.Они просто запрашивают URL-адрес, введенный с сервера.