O atributo de dados da tag do objeto deve ser codificado em porcentagem?
-
14-11-2019 - |
Pergunta
Suponha que meu aplicativo web renderize a seguinte tag:
<object type="application/x-pdf" data="http://example.com/test%2Ctest.pdf">
<param name="showTableOfContents" value="true" />
<param name="hideThumbnails" value="false" />
</object>
Deve data
atributo pode ser escapado (caminho codificado por porcentagem) ou não?No meu exemplo é.Não encontrei nenhuma especificação.
termo aditivo
Na verdade, estou interessado em especificar o que os plug-ins do navegador devem consumir data
atributo esperamos ver lá.Por exemplo, o plugin Adobe Acrobat usa uri com e sem escape.No entanto, QWebPluginFactory guloseimas data
atributo como um URI legível por humanos (sem escape), e isso leva a uma codificação percentual dupla.E estou me perguntando se é um bug de QWebPluginFactory
ou não.
Solução
O data
atributo espera que o valor seja um URI.Portanto, você deve fornecer um valor que seja um URI sintaticamente válido.
A especificação atual de URIs é RFC 3986.Para ver se o ,
no caminho do URI precisa ser codificado, veja como o caminho regra de produção é definida:
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
Como temos um URI com autoridade informações, precisamos dar uma olhada caminho vazio (ver URI regra de produção):
path-abempty = *( "/" segment )
segmento é zero ou mais pchar caracteres que são definidos da seguinte forma (já ampliei as regras de produção):
pchar = ALPHA / DIGIT / "-" / "." / "_" / "~" / "%" HEXDIG HEXDIG / "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" / ":" / "@"
E como você pode ver, pchar expande para um literal ,
.Então você não precisa codificar o ,
no caminho componente.Mas como você tem permissão para codificar qualquer caractere não delimitador usando a codificação percentual sem alterar seu significado, não há problema em usar %2C
em vez de ,
.
Outras dicas
Os URLs geralmente só podem conter caracteres específicos.Infelizmente, especificações diferentes contêm listas diferentes de caracteres que são considerados reservados e, portanto, não podem ser usados.
No seu exemplo, o caractere codificado é uma vírgula (,
), que é um caractere reservado em algumas especificações, portanto não é errado codificá-lo.
A maioria dos servidores web deve lidar igualmente com vírgulas não codificadas e codificadas, no entanto, pode haver alguns que não o façam, dependendo de sua configuração.Devido a isso, geralmente é uma boa ideia evitar caracteres especiais em nomes de arquivos (como no seu exemplo).
A codificação de URL é sempre necessária quando você possui caracteres especiais em parâmetros GET.Por exemplo, um parâmetro GET que é compatível com C&A
como um valor deve ser escrito como:
http://example.com/somescript.php?value=C%26A
EDITAR:
Os plug-ins (ou mesmo o navegador) não se importam de qualquer maneira.Eles não tentam (ou precisam) decodificá-lo ou algo parecido.Eles apenas solicitam o URL inserido no servidor.