5

我正在实现一个 URL 解析器,并且对 W3C URL 规范有疑问(在http://www.w3.org/TR/2014/WD-url-1-20141209/)在“2. Percent-encoded bytes”部分它具有以下算法(已添加重点):

要对字节序列输入进行百分比解码,请运行以下步骤:

当输入包含 0x00 到 0x7F 范围之外的字节时,使用除 utf-8 解码器之外的任何东西可能是不安全的,不推荐使用。

  1. 设输出为空字节序列。

  2. 对于输入中的每个字节字节,运行以下步骤:

    1. 如果 byte 不是 '%',则将 byte 附加到输出。

    2. 否则,如果 byte 是 '%' 并且输入中 byte 之后的下两个字节不在 0x30 到 0x39、0x41 到 0x46 和 0x61 到 0x66 的范围内,则将 byte 附加到输出。

    3. 否则,运行以下子步骤:

      1. 令 bytePoint 为输入中 byte 之后的两个字节,decoded,然后解释为十六进制数。

      2. 将一个值为 bytePoint 的字节附加到输出。

      3. 跳过输入中接下来的两个字节。

  3. 返回输出。

在原始规范中,单词“decoded”(上面的粗体字)是指向 UTF-8 解码算法的链接。我假设这是上面第二句(斜体)中提到的“utf-8 解码器”。

我了解无效的 UTF-8 字节序列会导致安全问题。但是,在使用解码器的步骤中,字节已经被前面的子步骤 2 验证为有效的 ASCII 十六进制数字,因此似乎在这里使用 UTF-8 解码器来保证安全性是多余的。

当解码器仅用于 0x30 到 0x39、0x41 到 0x46 和 0x61 到 0x66 范围内的字节值时,谁能解释在这个算法中使用 UTF-8 解码器以外的东西可能是不安全的?还是我在规范中解释错误?

在我看来,0x00 到 0x7f 范围之外的任何字节都将按原样复制到输出(在子步骤 1 中因为它们不是 %,或者在子步骤 2 中因为它们不是 ASCII 十六进制数字),所以它们在这个算法中永远不会出现在解码器中。

4

0 回答 0