URL编码
什么是URL編碼
url編碼是一種瀏覽器用來打包表單輸入的格式
URL編碼與解碼
最近做題經(jīng)常碰到二次編碼繞過,于是打算系統(tǒng)總結(jié)一下關(guān)于URL編碼
相關(guān)內(nèi)容
為什么URL要編碼
URL之所以要編碼是因?yàn)閁RL中有些字符會引起歧義
情況一url參數(shù)字符串使用key=value鍵值來傳參,鍵值之間用&分隔,如/?admin=123&password=123可是如果是/?admin=12=3&password=12&3這樣value字符串包含了=或&,會造成接收Url服務(wù)器解析錯(cuò)誤,所以必須要將&和=進(jìn)行轉(zhuǎn)義
情況二url的編碼格式是ASCII碼,而不是Unicode,也就是說Url中不能包含中文
編碼原則
使用安全字符(沒有特殊意義或者特殊意義的可打印字符)表示不安全字符
哪些字符需要編碼
url中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、特殊字符-_.~、保留字符(: / ? # [ ] @ ! $ & ’ ( ) * + , ; =)
不安全字符和US-ASCII碼中的非可打印字符(10-7F字節(jié)表示控制字符,80-FF字節(jié)的字符)
關(guān)于保留字符
(: / ? # [ ] @)用于分隔不同組件
- :用于分隔協(xié)議和主機(jī)
- /用于分隔主機(jī)和路徑
- ?用于分隔路徑和查詢參數(shù)
(!$&’()*+,;=)用于在每個(gè)組件中起到分隔作用
- =用于 表示查詢參數(shù)中的鍵值對
- &符號用于分隔查詢多個(gè)鍵值對
特別的組件中的普通數(shù)據(jù)包含這些數(shù)據(jù)時(shí),需要對其進(jìn)行編碼
關(guān)于不安全字符
不安全字符:可能會引起解析程序的歧義的字符
- 空格:Url在傳輸?shù)倪^程,或者用戶在排版的過程,或者文本處理程序在處理Url的過程,都有可能引入無關(guān)緊要的空格,或者將那些有意義的空格給去掉
- 引號以及<>:引號和尖括號通常用于在普通文本中起到分隔Url的作用
- #:通常用于表示書簽或者錨點(diǎn)
- %:百分號本身用作對不安全字符進(jìn)行編碼時(shí)使用的特殊字符,因此本身需要編碼(經(jīng)常被拿來做考點(diǎn)比如結(jié)合urldecode()的二次編碼繞過,當(dāng)傳入?yún)?shù)時(shí),瀏覽器在后面會對非ASCII碼的字符(比如中文)進(jìn)行一次urlencode
然后在這段代碼中運(yùn)行時(shí),會自動(dòng)進(jìn)行一次urldecode將先前urlencode的碼給解碼了) - {}|^[]`~:某一些網(wǎng)關(guān)或者傳輸代理會篡改這些字符
三個(gè)編碼函數(shù)
escape,encodeURI,encodeURIComponent——均用于將不安全不合法的url字符轉(zhuǎn)換為合法的字符表示
不同點(diǎn):
- 安全字符不同(函數(shù)不會對這些字符進(jìn)行編碼)
- escape(69個(gè)):*/@±._0-9a-zA-Z
- encodeURI(82個(gè)):!#$&’()*+,/:;=?@-._~0-9a-zA-Z
- encodeURIComponent(71個(gè)):!’()*-._~0-9a-zA-Z
- 兼容性不同
- 對Unicode字符的編碼方式不同
- 適用場合不同:encodeURI被用作對一個(gè)完整的URI進(jìn)行編碼,而encodeURIComponent被用作對URI的一個(gè)組件進(jìn)行編碼
最后是常用的編碼表
放到這方便查
總結(jié)
- 上一篇: 1.Matlab图像的读取和显示
- 下一篇: Axure中使用fontawesome字