2012-10-10 80 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