【问题标题】:Should data attribute of object tag be percent-encoded?对象标签的数据属性是否应该进行百分比编码?
【发布时间】:2011-03-31 09:09:37
【问题描述】:

假设我的 Web 应用程序呈现以下标签:

<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。但是,QWebPluginFactorydata 属性视为人类可读的 URI(未转义),这会导致双百分比编码。我想知道这是否是QWebPluginFactory 的错误。

【问题讨论】:

    标签: html url object-tag percent-encoding custom-data-attribute


    【解决方案1】:

    data attribute 期望值是一个 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
    

    由于我们有一个带有 authority 信息的 URI,我们需要查看 path-abempty(参见 URI production rule):

    path-abempty  = *( "/" segment )
    

    segment 是零个或多个 pchar 字符,定义如下(我已经扩展了生产规则):

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

    如您所见,pchar 扩展为文字 ,。所以你不需要在 path 组件中编码,。但是由于您可以使用百分比编码对任何非定界字符进行编码而不改变其含义,因此可以使用%2C 而不是,

    【讨论】:

    • 接受这个答案,因为它指出了最重要的事情:data 属性是根据规范的 URI。
    【解决方案2】:

    URL 通常只能包含特定字符。不幸的是,不同的规范包含不同的字符列表,这些字符被认为是保留的,因此不能使用。

    在您的示例中,编码字符是逗号 (,),在某些规范中是保留字符,因此对其进行编码并没有错。

    大多数网络服务器应该平等地处理未编码和编码的逗号,但也可能有一些不处理,这取决于它们的配置。因此,首先避免在文件名中包含特殊字符(如您在示例中所使用的)通常是一个好主意。

    当 GET 参数中有特殊字符时,总是需要 URL 编码。例如,支持将C&amp;A 作为值的 GET 参数必须写为:

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

    编辑:

    插件(甚至浏览器)并不在意。他们不会尝试(或不需要)解码它或类似的东西。他们只是请求从服务器输入的 URL。

    【讨论】:

    • 实际上,我对使用data 属性的浏览器插件期望在那里看到的规范感兴趣。我将扩展我的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 2023-04-02
    • 2018-09-09
    相关资源
    最近更新 更多