我正在尝试编写一个对 URI 进行编码的函数,以使它们符合rfc 3986。
即检查除字母以外的每个字符;/?:@&=+$-_.!~*'()|\^[]``#
被取代%[hex octet]
我想确保如果使用已经编码的 URI 调用函数,代码不会破坏它。
到目前为止,我所做的只是寻找一个 '%' 符号,后跟 2 个八位字节字符。我发现我替换的任何其他保留字符。
我还应该做其他检查吗?
不要介意安全问题;他们正在其他地方处理。
我认为正确编码的 URI 应该总是第二次干净地通过。
原因是无论如何您都必须正确解析 URI,因为/ @ . : ? & =
在 URI 中包含字符是完全合法的,只要它们出现在正确的位置即可。
因此,只有在 URI 的该部分不合法时才对字符进行编码。有了这个断言,你就可以创建一个在每个位置都是合法的编码字符串,所以当你解析它时,就没有什么可以编码的了。
请记住,如果有人向您抛出要编码的 URI,并且它恰好是模棱两可的(即,它包含改变 URI 语法的特殊字符),他们就不能期望得到正确的结果。
为了更直接地回答您的问题,我会说是的:鉴于上述所有情况,您只需要对%
转义序列进行特殊处理。
嗯,你怎么知道已经编码的 URI 不应该再次编码?也许URI包含,我不知道,如何编码URI的例子,如果不会被第二次编码,那么解码会破坏它?
也就是说,您可以检查是否只%
存在允许的字符加号,以及是否每个字符都%
后跟一个十六进制数字。如果是,则很有可能(但不能保证)编码已经完成。