2012-10-10 65 views
0

我正在尝试编写一个函数来编码URI以使它们符合rfc 3986阻止编码URI两次

I.e.检查除了字母以外的每个字符; /?:@&=+$-_.!~*'()|\^[]``#被替换为%[hex octet]

我想确定,如果函数被调用了已经编码的URI,代码不会毁掉它。

到目前为止,我所做的只是寻找'%'符号,然后是2个八位字符。任何其他保留字符,我发现我替换。

有没有其他检查我应该做的?

不介意安全问题;他们正在其他地方被处理。

回答

1

我认为正确编码的URI应该总是在第二次干净地通过。

原因是您必须正确解析URI,无论如何,因为在URI中提供诸如/ @ . : ? & =的字符是完全合法的,只要它们出现在正确的位置。

因此,如果它在URI的那部分中不合法,则只编码字符。用这个断言,然后你创建一个在每个位置都合法的编码字符串,所以当你解析它时,没有什么可以编码的。请注意,如果有人在您的URI上抛出一个URI进行编码并且它恰好不明确(它包含特殊字符,它们会改变URI语法),但它们不能指望正确的结果。

要更直接地回答你的问题,我会说是的:鉴于上述所有情况,你只需要对%转义序列进行特殊处理。

+0

我会修改我的答案,其实......处理转义序列不是*特殊处理*。这只是符合RFC的整体处理的一部分。 – paddy

0

嗯,你怎么知道一个已编码的URI不应该再次被编码?也许这个URI包含,我不知道,例如如何编码URI,如果不能再次进行编码,那么解码会破坏它?

也就是说,你可以检查是否只有允许的字符加%是否存在,以及是否每个%后跟一个十六进制数字。如果是,那么很可能(但不能保证)编码已经完成。

+0

我不介意第二种编码本身,我真正不想做的是通过监督某件事来搞砸它。 – imreal