Должен ли атрибут данных тега объекта кодироваться в процентах? - PullRequest
0 голосов
/ 31 марта 2011

Предположим, мое веб-приложение отображает следующий тег:

<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 или нет.

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Атрибут data ожидает, что значение будет URI. Таким образом, вы должны предоставить значение, которое является синтаксически допустимым URI.

Текущая спецификация URI: RFC 3986 . Чтобы понять, нужно ли кодировать , в пути URI, взгляните, как определено производственное правило path :

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 с полномочиями информацией, нам нужно взглянуть на path-abempty (см. URI производственное правило ):

path-abempty  = *( "/" segment )

сегмент - ноль или более pchar символов, которые определены следующим образом (я уже расширил правила производства):

pchar         = ALPHA / DIGIT / "-" / "." / "_" / "~" / "%" HEXDIG HEXDIG / "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" / ":" / "@"

И, как вы можете видеть, pchar расширяется до буквального ,. Поэтому вам не нужно кодировать , в компоненте path . Но так как вам разрешено кодировать любой символ без разделителя, используя кодировку процентов без изменения его значения, то лучше использовать %2C вместо ,.

0 голосов
/ 31 марта 2011

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

В вашем примере закодированный символ - это запятая (,), которая в некоторых спецификациях является зарезервированным символом,так что это не так, кодировать его.

Большинство веб-серверов должны одинаково обрабатывать не закодированные и закодированные запятые, однако могут быть некоторые, которые этого не делают, в зависимости от их конфигурации.В связи с этим, как правило, рекомендуется избегать использования специальных символов в именах файлов (как у вас в вашем примере).

Кодировка URL всегда необходима, когда в параметрах GET есть специальные символы.Например, параметр GET, который поддерживает принятие C&A в качестве значения, должен быть записан как:

http://example.com/somescript.php?value=C%26A

РЕДАКТИРОВАТЬ:

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

...